Extraire plusieurs fichiers .tar.gz avec un seul appel tar

35

Je me demandais s'il était possible (et bien entendu, comment) tard'extraire plusieurs fichiers en une seule fois.

Je suis un utilisateur Unix expérimenté depuis plusieurs années et, bien sûr, je sais que vous pouvez utiliser forun findou plusieurs éléments de ce type pour appeler tarune fois pour chaque archive que vous souhaitez extraire, mais je ne pouvais pas créer de ligne de commande fonctionnelle qui aurait causé mon erreur. tarextraire deux fichiers .tar.gz à la fois. (Et non, il n'y a rien de mal avec for, je demande simplement s'il est possible de s'en passer.)

Je pose cette question plutôt par curiosité, peut-être

  • il y a une étrange fourche de tarquelque part qui prend en charge cette
  • quelqu'un sait comment utiliser le -Mparamètre qui tarm'a suggéré quand j'ai essayétar -zxv -f a.tgz -f b.tgz
  • nous sommes tous aveugles et il est tout à fait facile à faire - mais je ne pouvais pas trouver un indice dans le Web qui n'a pas utilisé forou findou xargsou similaires.

S'il vous plaît ne répondez pas avec tar -zxvf *.tar.gz(parce que cela ne fonctionne pas ) et répondez seulement avec "ne fonctionne pas" si vous en êtes absolument sûr (et peut-être une bonne explication pourquoi ).

Edit: On m'a signalé une réponse à cette question sur Stack Overflow, qui indique de manière très détaillée que ce n'est pas possible sans casser la tarsyntaxe actuelle , mais je ne pense pas que ce soit le cas. Utiliser tar -zxv -f a.tgz -f b.tgzou tar -zxv --all-args-are-archives *.tar.gzne casserait aucune syntaxe existante, à mon humble avis.

scy
la source
Par curiosité, quelle est la situation qui vous a amené à commencer à réfléchir à la manière d'éviter une construction en boucle?
Unclejamil
1
FYI: GNU tar supporte les archives tar multi-volumes avec le -Mparamètre.
Steve-o
1
unclejamil: J'écris un HowTo et l'une des étapes consiste à décompresser plusieurs fichiers compressés (.tar.bz2, .tar.gz, .zip). Et comme il s’agit d’un HowTo, je me demandais quelle serait la ligne de commande la plus élégante. :)
scy

Réponses:

39

C'est possible, la syntaxe est assez simple:

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

L'option -i ignore le fichier EOF situé à la fin des archives du fichier tar, à partir de la page de manuel:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
polynôme
la source
1
Cela a semblé fonctionner pour moi. Commande exacte j'été: cat *.tar.bz2 | tar -ixjv. Merci!
Scy
1
<Pour tgz> cat * .tgz | tar -xzvf - -i -C / destination / <ou> pour le fichier au format * .tgz; do tar -xzvf $ fichier -C / destination /; done
Ferroao
27

pour * .tar.gz

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

pour * .tar.bz2

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

pour * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Ratnesh
la source
1
Fixez la mise en forme ici, et ce sera plus lisible.
eyoung100
c'est bien. le format est également excellent parce que c'est comme ça dans le terminal
smatthewenglish
1
N'oubliez pas de mettre des guillemets $filesi vos fichiers ont des noms avec des espaces.
Alexander Revo
Cela ne répond pas vraiment à la question de savoir s'il est possible d'extraire plusieurs archives en utilisant un seul appel de tar. De plus, l'utilisateur dit qu'il est déjà familiarisé avec l'utilisation des boucles for pour parcourir un ensemble de fichiers.
Kusalananda
2

Vous devez utiliser une boucle. Cela n'empêcherait pas la tarsyntaxe de ligne de commande de permettre plusieurs -foptions, mais il faudrait ajouter du code pour traiter plusieurs archives en séquence, avec toutes sortes de conditions de bord (Que se passe-t-il si une archive au milieu est mal formée? Les archives peuvent-elles utiliser différentes Vous pouvez également disposer de plusieurs -Coptions (option GNU tar à extraire dans un répertoire particulier)? Qu'en est-il de -K (option GNU tar à partir d'un certain nom de membre)?…).

Une possibilité d'éviter une forboucle consiste à installer et à activer AVFS , un système de fichiers FUSE offrant un accès transparent aux archives. Chaque archive /path/to/archivesert également de répertoire ~/.avfs/path/to/archive#. Si vous souhaitez faire correspondre les archives avec des caractères génériques, il est difficile de l'ajouter #à une correspondance générique; cela peut être fait en zsh.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
Gilles, arrête de faire le mal
la source
-1

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

Zjengjie
la source
qu'est-ce que cela fait?
Pierre.Vriens
1
Cela introduit une boucle implicite appelant tar une fois pour chaque fichier trouvé, et l'utilisateur dit qu'il sait déjà le faire.
Kusalananda
Désolé, je n'ai pas lu la question attentivement, je cherchais simplement le moyen d'extraire plusieurs packs de tar, de lire la réponse ci-dessus et de penser que l'utilisation de la recherche serait plus facile.
Zjengjie