comando linux shell tar

linux - comando - Error de shell ''tar: no encontrado en el archivo'' cuando se usa una expresión regular



comando tar linux (3)

Cuando uso tar -xzf *.gz para extraer todos los archivos .gz en el directorio actual, tar -xzf *.gz Not found in archive . Sin embargo, funciona bien si extraigo uno por uno o si uso un bucle for como

for file in `ls *.gz`; do tar -xzf $file; done

¿Cuál es la razón de este error?


Cuando escribes

tar -xzf *.gz

tu shell lo expande a la cadena:

tar -xzf 1.gz 2.gz 3.gz

(asumiendo que 1.gz, 2.gz y 3.gz están en su directorio actual).

tar piensa que quieres extraer 2.gz y 3.gz de 1.gz ; no puede encontrar estos archivos en los archivos y eso causa el mensaje de error.

Necesita usar loop for comandos xargs para extraer sus archivos.

ls *.gz |xargs -n1 tar -xzf

Eso significa: tar -xzf para cada archivo gz en el directorio actual.


Cuando escribes:

tar -xf *.gz

El comando tar ve (por ejemplo):

tar -xf abc.tar.gz def.tar.gz ghi.tar.gz

Esto se interpreta como una solicitud para extraer def.tar.gz y ghi.tar.gz del archivo abc.tar.gz Como los archivos no están allí, aparece el mensaje de advertencia.

En otras palabras, tar funciona en un solo archivo tar (posiblemente comprimido) a la vez (en una invocación). No funciona en múltiples archivos tar.

Tenga en cuenta que si abc.tar.gz contiene un archivo pqr/xyz/important.c , puede extraer solo un archivo especificando:

tar -xf abc.tar.gz pqr/xyz/important.c

La notación que utilizó es solo una variante de esta notación.

(Y sí, puede haber razones para tar un archivo tar . Por ejemplo, Gmail no le permite enviar un archivo tar o un archivo tar comprimido con gzip que contiene un archivo ejecutable. Sin embargo, si incrusta un archivo tar comprimido con gzip dentro un archivo tar no comprimido, no busca dentro del archivo interno para encontrar el archivo ejecutable. Lo uso cuando necesito enviar un archivo tar con un script de configure ejecutable.)


La razón principal es que tar toma un solo argumento de nombre de archivo. Cuando llama tar *.tgz bash extiende el * a todos los nombres de archivos con tgz formant y se convierte en tar file1 file2 file3 archivo1 archivo2 archivo3 que no es aceptado por tar . Entonces, o bien usas un bucle for i in *.tgz; do tar -zxvf $i ;done como for i in *.tgz; do tar -zxvf $i ;done for i in *.tgz; do tar -zxvf $i ;done o usar algún otro comando que ejecute tar como efecto secundario, como se muestra en los comentarios, es ls o find . -maxdepth 1 -name /*tgz -exec tar -zxvf {} /; find . -maxdepth 1 -name /*tgz -exec tar -zxvf {} /; (La salida ls siempre es arriesgada)