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)