tar umgekehrt zu '--to-command', oder: tar-Einträge einzeln komprimieren, oder: tar mit vielen großen Dateien

2

Ich möchte ein tar gzip-Archiv erstellen, aber in umgekehrter Reihenfolge wie am häufigsten: Die Dateien im Archiv müssen einzeln komprimiert werden, anstatt das gesamte Archiv zu komprimieren. Auf diese Weise behält es die suchbare Eigenschaft bei, die es haben sollte. Es macht für mich viel mehr Sinn und ich weiß nicht, warum dies nicht bevorzugt wurde.

Ich habe einige Ideen dazu:

Idealerweise möchte ich jedoch weiterhin tar verwenden, da es sich um ein bekanntes De-facto-Tool für die Archivierung handelt, in dem ich arbeite. tar hat den --to-commandSchalter, mit dem extrahierte Dateien an ein Programm weitergeleitet werden können. Wenn ich einen symmetrischen Befehl hätte, wie --from-commandich meinen Wunsch leicht umsetzen würde, mit:

tar cf my_archive.tar file1 file2 --from-command=gzip
tar xf my_archive.tar --to-command=gunzip

Meine Motivation liegt im Umgang mit Archiven, die eine große Anzahl großer Dateien enthalten. Ich habe sie derzeit tar-gzip, aber das Extrahieren von Dateien aus dem Archiv dauert lange - es muss dekomprimiert werden, bevor tar auf die Datei zugreifen kann, und das auf serielle Weise!

Also hier sind meine Fragen:

  • Gibt es einen offensichtlichen Weg, dies zu erreichen, den ich ignoriere?
  • Hat jemand schon ein Tool geschrieben, um speziell damit zu tun tar?
  • Wenn man tarund gzipund Standardmethoden zum Archivieren und Komprimieren in Linux aufrufen würde , welche wäre die äquivalente, beliebte Methode zum Archivieren mit Komprimierung in der von mir erwähnten Weise (dh nicht tar.gz )?
  • Gibt es eine andere Möglichkeit, die große Zeit zu umgehen, die zum Extrahieren einer Datei aus einem großen Archiv mit gezippten Targets erforderlich ist?

Vielen Dank!

BEARBEITEN

Mir ist klar, dass ich meine Frage neu formulieren und verfeinern muss. Zumal es, wie Robin Hood betonte, recht einfache Lösungen gibt, um komprimierte Archive zu erstellen (nämlich zip). Hier ist es also:

Gibt es eine Verwendungsmöglichkeit tar, die echten Direktzugriff auf das Archiv ermöglicht, während es trotzdem komprimiert bleibt? Wenn nicht, gibt es einen anderen tarErsatz für Linux (der mit dem gleichen Grundprinzip und im Idealfall mit Unterstützung für die gleichen Befehlszeilenoptionen erstellt wurde), der dies erreicht?

Im Moment kann ich tarim Allgemeinen ersetzen zipdurch:

tar c path/to/file1 path/to/file2 | gzip > arc.tar.gz
gunzip < arc.tar.gz | tar x

zu:

zip -qr - path/to/file1 path/to/file2 > arc.zip
unzip -qoX test.zip

Dies hat jedoch den Nachteil, dass nicht alle tarArchivierungsoptionen unterstützt werden:

  1. Piping jeder extrahierten Datei einzeln in eine Pipe (den --to-commandSwitch)
  2. unzipakzeptiert kein Archiv in Standardeingabe. funziptut dies jedoch - es wird nur die erste Datei im Archiv ausgegeben

Es ist also eher einschränkend.

Danke noch einmal!

Yuval
quelle
2
Was das Warum betrifft: Kompressionseffizienz. Wenn Sie alle Daten auf einmal komprimieren, erzielen Sie eine höhere Komprimierungsrate. Wenn Sie jede Datei einzeln komprimieren, kann dies insbesondere bei vielen kleinen Dateien zu einem Ergebnis führen, das größer als die gesamte Eingabegröße ist.
Daniel B
Andererseits erscheint es sinnvoll, dem Benutzer die Möglichkeit zu geben, zwischen Komprimierungseffizienz und Zugriffseffizienz zu wählen. Ich denke, dies ist sinnvoll, da tares für die Verwendung mit Bändern gedacht war - es unterstützt jedoch weiterhin durchsuchbare Archive!
Yuval

Antworten:

1

Ich habe Ihre Frage mehrmals gelesen, sie ist sehr schwer zu verstehen, aber ich glaube, ich habe sie jetzt. Sie möchten, dass Dateien in einzelne tar-Archive abgelegt und dann alle in einem gz-Archiv gespeichert werden. Dies funktioniert nicht, da gz-Archive nur die Komprimierung von 1 Datei unterstützen, weshalb Benutzer die Dateien tarieren, bevor sie mit gz komprimiert werden. Sie können das Gegenteil tun, indem Sie jede Datei in ein gz-Archiv und dann alle gz-Archive in ein einziges tar-Archiv kopieren. Alternativ können Sie einfach auf Formate verzichten, die eine doppelte Archivierung erfordern, und ein Archivformat verwenden, das mehrere Dateien unterstützt, z. B. zip.

Das Komprimieren der Dateien in einem tar führt weiterhin zu einem sequenziellen Zugriff auf die gz-Archive, da das tar-Format keinen wahlfreien Zugriff unterstützt. Zip-Archive verwenden ein zentrales Katalogverzeichnis, sodass ein wahlfreier Dateizugriff möglich ist, ohne dass das gesamte Archiv dekomprimiert oder gelesen werden muss. Ich archiviere nicht viel unter Linux, aber unter Windows verwende ich gerne 7-zip, um Zip-Archive mit lzma-Komprimierung zu erstellen. Es ist erwähnenswert, dass eine dieser Methoden bei vergleichbarer Komprimierung wie tar.gz ein größeres Archiv ergibt, da keine solide Komprimierung vorliegt, weshalb tar.gz in der Linux-Welt im Vergleich zu zip zum Verteilen von Software sehr beliebt ist .

Erstellen Sie eine Reihe von GZ-Archiven und speichern Sie sie in einem Tar-Archiv:

cp -a -n -v "/ home / me / example / inputfiles /." --target-directory = "/ home / me / example / gzfiles"

Dadurch werden die Dateien, die Sie archivieren möchten, in einen anderen Ordner kopiert. Mit Gunzip können Sie die nicht archivierten Originaldateien nicht behalten. Wenn Sie jedoch von einer Kopie aus arbeiten, können Sie dies vermeiden.

gzip -9 "/ home / me / example / gzfiles / *"

Dadurch wird ein separates gz-Archiv für jede Datei erstellt und die maximale Komprimierung verwendet. Wenn Ihr System das nicht kann, versuchen Sie es mit einer niedrigeren Zahl. Die Standardnummer ist 6.

tar -cf "/home/me/example/tar/archive.tar" -C "/ home / me / example / gzfiles."

Dadurch wird ein einzelnes tar-Archiv erstellt, das alle gz-Archive enthält.

Extrahieren einer einzelnen Datei aus einem GZ-Archiv in einem Tar-Archiv:

sudo apt-get install archivemount

Dadurch wird archive mount installiert, ein Tool, mit dem TAR-Dateien in ein Verzeichnis geladen werden können.

archivemount -o schreibgeschützt "/home/me/example/tar/archive.tar" "/ home / me / example / mount"

Dadurch wird das tar-Archiv eingehängt, sodass Sie das gewünschte gz-Archiv extrahieren können. Ich glaube, es ist möglich, einzelne Dateien mit tar aus einem tar-Archiv zu extrahieren, aber ich kenne den Befehl nicht, weshalb ich diesen Ansatz verwende.

gunzip -c "/home/me/example/mount/example1.txt.gz"> "/home/me/example/extract1/example1.txt"

Dadurch wird die Datei extrahiert. Gunzip unterstützt nur das Extrahieren in das Quellverzeichnis oder in die Standardausgabe. Daher haben wir in diesem Befehl die Standardausgabe verwendet und die Ausgabe dann an eine Datei weitergeleitet.

sudo umount "/ home / me / example / mount"

Dadurch wird das Tar-Archiv entladen.

Extrahieren Sie alle Dateien aus einer Reihe von GZ-Archiven in einem Tar-Archiv:

cd "/ home / me / example / extractall"

Dadurch wird das Terminal in das Verzeichnis verschoben, in das Sie extrahieren möchten, da tar in das aktuelle Verzeichnis extrahiert.

tar -xf /home/me/example/tar/archive.tar

Dadurch werden die gz-Archive extrahiert.

gunzip * .gz

Dadurch wird der Inhalt der gz-Archive in das aktuelle Verzeichnis extrahiert /home/me/example/extractall/und die gz-Archive entfernt.

Erstellen Sie ein ZIP-Archiv:

cd "/ home / me / beispiel / eingabedateien"

Dadurch wird das Terminal in das Verzeichnis inputfiles verschoben, da zip aus dem aktuellen Verzeichnis ein Archiv erstellt und dort speichert.

zip -9 -r Eingabedateien inputfiles.zip *

Dadurch wird ein Zip-Archiv aller Verzeichnisinhalte der Eingabedateien erstellt, ausgenommen versteckte Dateien, und es wird die maximale Komprimierung verwendet. p7-zip ist ein besseres Werkzeug, wenn Sie eine hohe Komprimierung benötigen.

mv "/home/me/example/inputfiles/inputfiles.zip" "/home/me/example/zip/archive.zip"

Auf diese Weise können Sie das Archiv beliebig umbenennen und an den gewünschten Ort verschieben.

Ein ZIP-Archiv extrahieren:

cd "/ home / ich / beispiel / zip"

Dadurch wird das Terminal in das Verzeichnis verschoben, in dem sich die ZIP-Datei befindet.

unzip -n archive.zip

Dadurch wird der Inhalt des ZIP-Archivs in das aktuelle Verzeichnis extrahiert.

Robin Hood
quelle
1
Danke für deine Antwort. Ich habe jedoch aus zwei Gründen nicht über die beiden ersten Absätze Ihrer Antwort hinausgelesen. Erstens haben Sie meine Frage nicht richtig verstanden: Ich habe gefragt, ob tardie Dateien komprimiert werden können, während sie zum Archiv hinzugefügt werden. Zweitens haben Sie falsch geschrieben, dass tarder Direktzugriff nicht unterstützt wird: siehe die --seekOption.
Yuval
1
PS Danke für die ausführliche Erklärung. zipist eine ausgezeichnete Option für das, was ich suche, und ich könnte es verwenden. In Bezug auf das Extrahieren einer einzelnen Datei für ein mit gzip komprimiertes tarArchiv lautet der Befehl:tar xfz archive.tgz path/in/archive/to/file
Yuval
@Yuval seekist eine Fähigkeit des tar-Programms, mit Archivformaten verwendet zu werden, die den wahlfreien Zugriff unterstützen. Das tar-Archivformat selbst ist nicht für den wahlfreien Zugriff ausgelegt. ( de.wikipedia.org/wiki/Tar_%28computing%29#Random_access ) ( duplicity.nongnu.org/new_format.html#nottar ) Es ist möglich, einzelne Dateien aus einem Teer zu extrahieren, dies erfordert jedoch das Scannen des gesamten Archivs finde sie, weil es keinen zentralen Katalog gibt. ( arstechnica.com/civis/viewtopic.php?f=16&t=409016 )
Robin Hood
1

Wenn Sie Dateien in einem Archiv mit wahlfreiem Zugriff einzeln komprimieren möchten, ist dar ("Disk ARchive") möglicherweise das, wonach Sie suchen. Neuere Versionen unterstützen die LZMA-Komprimierung, den von 7-Zip verwendeten Algorithmus. Es ist auch möglich, Filter zu definieren, um einige Dateitypen unkomprimiert zu speichern und Zeit zu sparen, z. B. Mediendateien und Archive, die bereits eine eigene Komprimierung haben. Meine Lieblingsfunktion ist das Komprimieren vorhandener (unkomprimierter) Archive, damit ich jetzt schnell ein Backup erstellen und die CPU-intensive LZMA-Komprimierung zu einem günstigeren Zeitpunkt oder auf einem leistungsstärkeren Computer ausführen kann:

dar --empty-dir \
  --fs-root /home \
  --create home-backup-2016-01-11 \
  --prune lost+found

Und dann später und / oder woanders:

dar -+ home-backup-2016-01-11-compressed-encrypted \
  -A home-backup-2016-01-11 \
  -zxz:6 \
  -K "aes:" \
  -an -ag -Z "*.mpg" -Z "*.avi" -Z "*.flac" -Z "*.cr2" \
  -Z "*.vob" -Z "*.jpg" -Z "*.jpeg" -Z "*.mpeg" -Z "*.png" \
  -Z "*.mp3" -Z "*.ogg" -Z "*.deb" -Z "*.tgz" -Z "*.tbz2" \
  -Z "*.rpm" -Z "*.xpi" -Z "*.run" -Z "*.sis" -Z "*.gz" \
  -Z "*.Z" -Z "*.bz2" -Z "*.zip" -Z "*.jar" -Z "*.rar" \
  -Z "*.xz" -Z "*.dar" -Z "*.7z" -acase

Wie oben gezeigt, ist auch eine Verschlüsselung möglich, während dennoch das Extrahieren einzelner Dateien möglich ist. Dar scheint jedoch kein äquivalent zu dem zu haben --to-command. Anhand Ihrer Frage ist schwer zu erkennen, ob Sie diese Funktion für etwas anderes als Dekomprimierung verwenden wollten.

(Ja, ich weiß, dass diese Frage alt ist. Dies ist für die Leute, die wie ich "Teerkompresse einzeln" gegoogelt haben und dies als erstes Ergebnis erhalten haben.)

Martin Gernhard
quelle