Extraiga múltiples archivos .tar.gz con una sola llamada tar

35

Me preguntaba si (y, por supuesto, cómo) es posible decir tarque extraiga varios archivos en una sola ejecución.

Soy un usuario experimentado de Unix durante varios años y, por supuesto, sé que puede usar foro findcosas así para llamar taruna vez por cada archivo que desee extraer, pero no pude encontrar una línea de comando que causara mi tarextraer dos archivos .tar.gz a la vez. (Y no, no hay nada de malo for, solo estoy preguntando si es posible prescindir de él).

Estoy haciendo esta pregunta por curiosidad, tal vez

  • hay un extraño tenedor de taralgún lugar que soporta esto
  • alguien sabe cómo usar el -Mparámetro que tarme sugirió cuando intentétar -zxv -f a.tgz -f b.tgz
  • estamos todos ciegos y que es totalmente fácil de hacer - pero no pudimos encontrar ningún indicio en la web que no utilizan foro findo xargso similares.

No responda con tar -zxvf *.tar.gz(porque eso no funciona) y solo responda con "no funciona" si está absolutamente seguro de ello (y tal vez tenga una buena explicación de por qué también).

Editar: me señalaron una respuesta a esta pregunta en Stack Overflow que dice en gran detalle que no es posible sin romper la tarsintaxis actual , pero no creo que sea cierto. Usar tar -zxv -f a.tgz -f b.tgzo tar -zxv --all-args-are-archives *.tar.gzno rompería ninguna sintaxis existente, en mi humilde opinión.

scy
fuente
Por curiosidad, ¿cuál es la situación que te hizo comenzar a pensar en cómo evitar una construcción en bucle?
unclejamil
1
FYI: GNU tar admite archivos tar de varios volúmenes con el -Mparámetro.
Steve-o
1
unclejamil: estoy escribiendo un HowTo y uno de los pasos implica desempacar varios archivos comprimidos (.tar.bz2, .tar.gz, .zip). Y dado que es un HowTo, me preguntaba cuál sería la línea de comando más elegante para hacer eso. :)
scy

Respuestas:

39

Esto es posible, la sintaxis es bastante fácil:

$ cat *.tar | tar -xvf - -i

La opción -i ignora el EOF al final de los archivos tar, desde la página del manual:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
polinomio
fuente
1
Esto pareció funcionar para mí. Comando exacto que utilicé fue: cat *.tar.bz2 | tar -ixjv. ¡Gracias!
scy
1
<Para tgz> cat * .tgz | tar -xzvf - -i -C / destination / <or> para el archivo en * .tgz; hacer tar -xzvf $ archivo -C / destino /; hecho
Ferroao
27

para * .tar.gz

for file in *.tar.gz; do tar -zxf "$file"; done

para * .tar.bz2

for file in *.tar.bz2; do tar -jxf "$file"; done

para * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Ratnesh
fuente
1
Arregle el formato aquí, y esto será más legible.
eyoung100
esto es genial. el formato también es genial porque así es como se ve en la terminal
smatthewenglish
1
No olvide poner comillas $filesi sus archivos tienen nombres con espacios.
Alexander Revo
Esto realmente no responde a la pregunta de si es posible extraer múltiples archivos usando una sola invocación de tar. Además, el usuario dice que ya está familiarizado con cómo usar for-loops para iterar sobre un conjunto de archivos.
Kusalananda
2

Necesitas usar un bucle. No rompería la tarsintaxis de la línea de comando para permitir múltiples -fopciones, pero requeriría agregar código para procesar varios archivos en secuencia, con todo tipo de condiciones de borde (¿Qué sucede si un archivo en el medio está mal formado? ¿Pueden los archivos usar diferentes mecanismos de compresión? ¿Puede tener múltiples -Copciones (opción GNU tar para extraer a un directorio en particular), también? ¿Qué pasa con -K (opción GNU tar para comenzar en un determinado nombre de miembro)? ...).

Una posibilidad para evitar un forbucle es instalar y activar AVFS , un sistema de archivos FUSE que proporciona acceso transparente a los archivos. Cada archivo /path/to/archivefunciona como un directorio ~/.avfs/path/to/archive#. Si desea hacer coincidir los archivos con comodines, hay un obstáculo para agregar que# a una coincidencia de comodines; Se puede hacer en zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
Gilles 'SO- deja de ser malvado'
fuente
-1

find . -name "*.tar.gz" -exec tar xzf {} \;

zjengjie
fuente
que hace esto
Pierre.Vriens
1
Esto introduce un bucle implícito que llama a tar una vez para cada archivo encontrado, y el usuario dice que ya sabe cómo hacerlo.
Kusalananda
lo siento, no leí la pregunta cuidadosamente, solo estaba buscando la forma de extraer múltiples paquetes de alquitrán, leí la respuesta anterior y pensé que usar el hallazgo sería más fácil.
zjengjie