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:
- Verwenden Sie ein Archivierungstool mit Komprimierung, z. B. 7zip
- Schreiben Sie dazu mein eigenes Skript, indem Sie zuerst die Dateien komprimieren und dann an tar übergeben (es wurde bereits ein handliches Python-Skript zum Schreiben einer tar-Datei gefunden, und die Python-GZIP-Bibliothek scheint einfach zu verwenden zu sein .
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-command
Schalter, mit dem extrahierte Dateien an ein Programm weitergeleitet werden können. Wenn ich einen symmetrischen Befehl hätte, wie --from-command
ich 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
tar
undgzip
und 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 nichttar.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 tar
Ersatz 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 tar
im Allgemeinen ersetzen zip
durch:
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 tar
Archivierungsoptionen unterstützt werden:
- Piping jeder extrahierten Datei einzeln in eine Pipe (den
--to-command
Switch) unzip
akzeptiert kein Archiv in Standardeingabe.funzip
tut dies jedoch - es wird nur die erste Datei im Archiv ausgegeben
Es ist also eher einschränkend.
Danke noch einmal!
quelle
tar
es für die Verwendung mit Bändern gedacht war - es unterstützt jedoch weiterhin durchsuchbare Archive!Antworten:
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:
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.
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.
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:
Dadurch wird archive mount installiert, ein Tool, mit dem TAR-Dateien in ein Verzeichnis geladen werden können.
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.
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.
Dadurch wird das Tar-Archiv entladen.
Extrahieren Sie alle Dateien aus einer Reihe von GZ-Archiven in einem Tar-Archiv:
Dadurch wird das Terminal in das Verzeichnis verschoben, in das Sie extrahieren möchten, da tar in das aktuelle Verzeichnis extrahiert.
Dadurch werden die gz-Archive extrahiert.
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:
Dadurch wird das Terminal in das Verzeichnis inputfiles verschoben, da zip aus dem aktuellen Verzeichnis ein Archiv erstellt und dort speichert.
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.
Auf diese Weise können Sie das Archiv beliebig umbenennen und an den gewünschten Ort verschieben.
Ein ZIP-Archiv extrahieren:
Dadurch wird das Terminal in das Verzeichnis verschoben, in dem sich die ZIP-Datei befindet.
Dadurch wird der Inhalt des ZIP-Archivs in das aktuelle Verzeichnis extrahiert.
quelle
tar
die Dateien komprimiert werden können, während sie zum Archiv hinzugefügt werden. Zweitens haben Sie falsch geschrieben, dasstar
der Direktzugriff nicht unterstützt wird: siehe die--seek
Option.zip
ist 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 komprimiertestar
Archiv lautet der Befehl:tar xfz archive.tgz path/in/archive/to/file
seek
ist 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 )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:
Und dann später und / oder woanders:
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.)
quelle