Extrahieren Sie mehrere .tar.gz-Dateien mit einem einzigen tar-Aufruf

35

Ich habe mich gefragt, ob (und natürlich wie) es möglich ist, tarmehrere Dateien in einem Durchgang zu extrahieren.

Ich bin seit mehreren Jahren ein erfahrener Unix-Benutzer, und natürlich weiß ich, dass Sie mit foroder findoder dergleichen tarfür jedes Archiv, das Sie extrahieren möchten, einmal einen Aufruf durchführen können tarum zwei .tar.gz-Dateien auf einmal zu extrahieren. (Und nein, daran ist nichts auszusetzen for, ich frage nur, ob es möglich ist, darauf zu verzichten.)

Ich stelle diese Frage vielleicht eher aus Neugier

  • Es gibt eine merkwürdige Abzweigung von tarirgendwo, die dies unterstützt
  • Jemand weiß, wie man den -MParameter verwendet, tarder mir beim Versuch vorgeschlagen wurdetar -zxv -f a.tgz -f b.tgz
  • wir sind alle blind und es ist total einfach zu machen - aber ich konnte keinen Hinweis im Web finden, der nicht verwendet foroder findoder xargsoder dergleichen.

Bitte antworten Sie nicht mit tar -zxvf *.tar.gz(weil das nicht funktioniert) und antworten Sie nur mit „Funktioniert nicht“, wenn Sie sich absolut sicher sind (und vielleicht auch eine gute Erklärung dafür haben).

Bearbeiten: Ich wurde auf eine Antwort auf diese Frage zu Stack Overflow hingewiesen, die im Detail besagt, dass es nicht möglich ist, ohne die aktuelle tarSyntax zu brechen , aber ich denke nicht, dass das wahr ist. Mit tar -zxv -f a.tgz -f b.tgzoder tar -zxv --all-args-are-archives *.tar.gzwürde keine bestehende Syntax brechen, imho.

scy
quelle
In welcher Situation haben Sie sich neugierig Gedanken darüber gemacht, wie Sie ein Schleifenkonstrukt vermeiden können?
Onkeljamil
1
Zu Ihrer Information: GNU tar unterstützt Multi-Volume-Tar-Archive mit dem -MParameter.
Steve-o
1
unclejamil: Ich schreibe ein HowTo und einer der Schritte darin beinhaltet das Entpacken mehrerer komprimierter Dateien (.tar.bz2, .tar.gz, .zip). Und da es sich um ein HowTo handelt, habe ich mich gefragt, wie die eleganteste Befehlszeile dafür aussehen würde. :)
scy

Antworten:

39

Dies ist möglich, die Syntax ist ziemlich einfach:

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

Die Option -i ignoriert die EOF am Ende der tar-Archive auf der Manpage:

-i, --ignore-zeros
ignore blocks of zeros in archive (normally mean EOF)
Polynom
quelle
1
Das schien für mich zu funktionieren. Genauer Befehl ich verwendet wurde: cat *.tar.bz2 | tar -ixjv. Vielen Dank!
scy
1
<Für tgz> cat * .tgz | tar -xzvf - -i -C / destination / <oder> für Datei in * .tgz; do tar -xzvf $ file -C / destination /; erledigt
Ferroao
27

für * .tar.gz

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

für * .tar.bz2

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

für * .tar.xz

for file in *.tar.xz; do tar -Jxf "$file"; done
Ratnesh
quelle
1
Korrigieren Sie hier die Formatierung, damit diese besser lesbar ist.
eyoung100
das ist toll. das format ist auch super, weil es im terminal so aussieht
smatthewenglish 10.04.15
1
Vergessen Sie nicht, Anführungszeichen zu setzen, $filewenn Ihre Dateien Namen mit Leerzeichen haben.
Alexander Revo
Dies beantwortet nicht wirklich die Frage, ob es möglich ist, mehrere Archive mit einem einzigen Aufruf von tar zu extrahieren. Darüber hinaus ist der Benutzer bereits mit der Verwendung von for-Schleifen zum Durchlaufen einer Reihe von Dateien vertraut.
Kusalananda
2

Sie müssen eine Schleife verwenden. Es würde die tarBefehlszeilensyntax nicht brechen , um mehrere -fOptionen zuzulassen , aber es würde das Hinzufügen von Code erfordern, um mehrere Archive nacheinander mit allen möglichen Randbedingungen zu verarbeiten (Was passiert, wenn ein Archiv in der Mitte fehlerhaft formatiert ist? Können die Archive andere verwenden?) Komprimierungsmechanismen? Können Sie auch mehrere -COptionen haben (GNU tar-Option, um in ein bestimmtes Verzeichnis zu extrahieren)? Was ist mit -K (GNU tar-Option, um bei einem bestimmten Mitgliedsnamen zu beginnen)?…).

Eine Möglichkeit, eine forSchleife zu vermeiden , besteht darin, AVFS zu installieren und zu aktivieren , ein FUSE- Dateisystem, das transparenten Zugriff auf Archive bietet. Jedes Archiv dient gleichzeitig /path/to/archiveals Verzeichnis ~/.avfs/path/to/archive#. Wenn Sie die Archive mit Platzhaltern abgleichen möchten, müssen Sie diese #einem Platzhalter-Match hinzufügen . es kann in zsh gemacht werden.

mountavfs
cp -p ~/.avfs$PWD/{a,b}.tgz\#/* /destination
cp -p ~/.avfs/path/to/source/*.tgz(e\''REPLY=$REPLY\#'\')/* /destination
Gilles 'SO - hör auf böse zu sein'
quelle
-1

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

zjengjie
quelle
was macht das
Pierre.Vriens
1
Dies führt eine implizite Schleife ein, die tar einmal für jede gefundene Datei aufruft, und der Benutzer sagt, dass er bereits weiß, wie dies zu tun ist.
Kusalananda
Entschuldigung, habe die Frage nicht sorgfältig gelesen. Ich habe nur nach dem Weg gesucht, mehrere Teerpakete zu extrahieren. Lies die Antwort oben und denke, die Suche wird einfacher.
Zjengjie