Eine Datei zu einem vorhandenen tar.gz-Archiv hinzufügen / aktualisieren?

73

Gibt es eine Möglichkeit, eine Datei in einem tar.gz-Archiv hinzuzufügen / zu aktualisieren? Grundsätzlich habe ich ein Archiv, das eine Datei unter enthält, /data/data/com.myapp.backup/./files/settings.txtund ich möchte diese Datei aus dem Archiv (bereits fertig) ziehen und sie nach erfolgter Bearbeitung wieder in das Archiv zurückschieben. Wie kann ich das erreichen? Ist es problematisch wegen der .im weg?

Naftuli Kay
quelle
2
+1. Dies würde das Arbeiten unter OS X so einfach machen. Momentan muss ich ein Verzeichnis von allen versteckten Dateien wie Hand bereinigen .DS_Storeund dann das Verzeichnis neu tarieren.

Antworten:

15

Das Dateiformat tar besteht nur aus einer Reihe von Dateien, die mit einigen Kopfzeilen verknüpft sind. Es ist keine sehr komplizierte Aufgabe, sie zu zerreißen, Ihre Inhalte einzulegen und wieder zusammenzusetzen. Davon abgesehen, beschrieben Jander wie Teer als ein Programm nicht die Nutzenfunktionen hat , dies zu tun und es gibt zusätzliche Komplikationen mit Kompression, die sowohl vor als auch nach einer Änderung.

Es gibt jedoch Werkzeuge für den Job! Es gibt mindestens zwei Systeme, mit denen Sie ein komprimiertes tar-Archiv in einen Ordner zurückschleifen und dann Ihre Änderungen im Dateisystem vornehmen können. Wenn Sie fertig sind, hängen Sie den Ordner aus und Ihr komprimiertes Archiv ist bereit zum Rollen.

Die erste Option wäre das Archivierungsprojekt für FUSE . Hier ist ein Tutorial dazu . Ihr System verfügt wahrscheinlich bereits über FUSE. Wenn dies nicht der Fall ist, sollte Ihre Distribution eine Option dafür haben.

Die andere Option ist Tarfs . Es ist einfacher zu benutzen , aber ich habe gehört, dass es Probleme mit der Beschädigung von bzip2-Archiven gibt, so dass Sie dies vielleicht zuerst gründlich testen können.

Caleb
quelle
1
Ich benutze AVFS , das in Ubuntu und Debian gepackt ist. Wissen Sie, wie ArchiveMount und Tarfs im Vergleich zu AVFS sind?
Gilles
Ehrlich gesagt, nein, das tue ich nicht, obwohl ich neugierig bin, mich mit AVFS zu befassen, nachdem Sie die Alternative erwähnt haben. Ich habe sowohl Archiv-Mount als auch Tarfs verwendet, aber es war seit langem ein stillgelegtes Projekt und ich kenne ihren aktuellen Status nicht. Aus dieser Erfahrung bin ich zu dem Schluss gekommen, dass die Idee konzeptionell falsch war, auch wenn die Umsetzung perfekt funktionierte.
Caleb,
Ich habe mir angesehen, wie ArchiveMount funktioniert. Die vorhandene .tar.gz-Datei wird nicht geändert, aber wenn Sie die Bereitstellung aufheben, wird das Original umbenannt und stattdessen eine brandneue tar-Datei erstellt. Wenn Sie auf der Suche nach einer guten Benutzererfahrung sind, ist dies großartig. Wenn Sie jedoch aus Effizienzgründen vermeiden möchten, das gesamte Archiv neu zu schreiben, hilft dies nicht.
Jander
@ Jander Das ist für den Hinweis darauf. Ich bin mir ziemlich sicher, dass dies für alle Optionen zum Mounten von komprimierten Archiven gilt. Das Problem ist, dass die einzelnen Teile der Datei nicht komprimiert sind, die internen Header der gesamten Datei und alles komprimiert ist und damit andere Dinge extrahiert werden können, muss gzip wie erwartet über den gesamten Datensatz ausgeführt werden. Es gibt keine Möglichkeit, etwas dazwischen zu injizieren, ohne es zu extrahieren, die Komprimierung erneut auszuführen und die gesamte Datendatei neu zu schreiben. Daher meine vorherige Bemerkung, dass es konzeptionell die falsche Lösung ist . Archive sind Archive.
Caleb
43

Um Ihre Datei aus Ihrem Archiv zu ziehen, können Sie verwenden tar xzf archive.tar.gz my/path/to/file.txt. Beachten Sie, dass auch die Verzeichnisse im Pfad der Datei erstellt werden. Verwenden Sie tar t(dh tar tzf archive.tar.gz), um die Dateien im Archiv aufzulisten.

tarunterstützt keine "In-Place" -Updatierung von Dateien. Sie können jedoch Dateien an das Ende eines Archivs anfügen, auch wenn sie denselben Pfad haben wie eine Datei, die sich bereits im Archiv befindet. In diesem Fall befinden sich beide Kopien der Datei im Archiv, und die später hinzugefügte Datei überschreibt die frühere. Der zu verwendende Befehl ist tar r(oder tar unur Dateien hinzuzufügen, die neuer als das Archiv sind) der zu verwendende Befehl. Das .im Weg sollte kein Problem sein.

Es gibt jedoch einen Haken: Sie können nicht zu einem komprimierten Archiv hinzufügen. Sie müssten also Folgendes tun:

gunzip archive.tar.gz
tar rf archive.tar data/data/com.myapp.backup/./files/settings.txt
gzip archive.tar

Das ist wahrscheinlich nicht das, was Sie hören möchten, da es bedeutet, das gesamte Archiv zweimal neu zu schreiben. Wenn es sich nicht um ein sehr großes Archiv handelt, ist es möglicherweise besser, das Ganze zu entpacken und es nach der Bearbeitung erneut zu tarieren. Alternativ können Sie ein nicht komprimiertes Archiv verwenden.

Jander
quelle
Diese Antwort ist nur insoweit richtig, als es sich um das Standardprogramm handelt tar. Tar als Dateiformat ist eigentlich sehr gut zugänglich. Sie könnten leicht ein Skript schreiben, um den Inhalt selbst zu aktualisieren, aber es gibt andere Tools, die dies bereits tun .
Caleb
23
Sie können dies auch auf Unix-Weise tun:gzip -dc archive.tar.gz | tar -r data/data/com.myapp.backup/./files/settings.txt | gzip >archive_new.tar.gz
Simon Richter
2
IIRC können Sie einfach zwei gzip'ed-Dateien verketten. Das Ergebnis ist eine größere gzip-Datei, die beide nicht komprimierten Dateien zusammenfasst.
FUZxxl
Ist es nach dem Entpacken der Datei nicht möglich, das Flag --update zu verwenden?
Pietro
@FUZxxl +1 für die Erwähnung der GZIP-Verkettung
Johan Boulé
9

Tar sollte ursprünglich für Bänder verwendet werden, daher ist das "Ersetzen" von Dateien im Design nicht wirklich enthalten. Sie können jedoch --delete verwenden, um die Datei aus dem ursprünglichen Teer zu löschen, und dann -u, um den Teer zu aktualisieren und die Datei erneut hinzuzufügen. Dies kann etwas dauern, da tar das Archiv intern neu organisieren muss.

Rleibman
quelle
Willkommen bei StackExchange! Ihre Antwort enthält nur einen Vorschlag, der bereits in einer anderen Antwort enthalten ist . Bitte lesen Sie vor der Beantwortung die anderen Antworten auf eine Frage, um Duplikate zu vermeiden.
JigglyNaga
1
Ich habe meine Antwort ein wenig überarbeitet. Ich glaube nicht, dass die andere Antwort --delete
rleibman
-5

Auf meinem Linux x86_64 GNU / Linux verwende ich dazu einfach den folgenden Befehl:

tar cvfpz /path/archive.tar -T list.txt

Dieser Befehl bewirkt die Erstellung eines komprimierten Archivs unter /pathVerwendung einer Liste von Dateien, die in der Datei enthalten sind list.txt.

user64312
quelle
6
Dadurch wird eine vorhandene Datei überschrieben /path/archive.tar, anstatt diese Datei hinzuzufügen / zu aktualisieren.
Anthon