Dateien aus dem Tar-Archiv entfernen

17

Ich habe eine große Datei foo.tar.xz, die eine Menge (sagen wir 200000) Dateien enthält. Ich habe herausgefunden, dass dieses Archiv einige (ungefähr 5000) Dateien enthält, die ich nicht möchte. Ich habe nicht genügend Speicherplatz, um das Ganze auf meiner Festplatte zu dekomprimieren. Außerdem befürchte ich, dass Attribute / Rechte verloren gehen könnten, wenn ich dies tue. Ich habe aber genug Platz, um zwei Kopien des komprimierten Archivs zu hosten . Gibt es ein Tool, um einige der Dateien (angegeben mit einem regulären Ausdruck im Dateinamen) im Handumdrehen aus dem Archiv zu entfernen, dh ohne das Archiv in einzelne Dateien zu entpacken?

FUZxxl
quelle

Antworten:

14

(bearbeitet, da ich die Frage missverstanden habe, die seitdem auch bearbeitet wurde)

Das Beste, was Sie tun können, ist, die gesamte Datei zu extrahieren, zu löschen und erneut zu komprimieren.

unxz < foobar-old.tar.xz | tar --delete foo/bar | xz > foobar-new.tar.xz

Es ist nicht möglich, Dateien direkt aus einem Teer zu löschen.

tar ist ein Stream, der ursprünglich für Bandlaufwerke gedacht ist, die keine zufälligen Suchvorgänge ausführen - während es theoretisch auf einem Plattendateisystem möglich sein könnte, eine Lücke zu lochen / die verbleibende Datei neu zu schreiben, ist bei der Komprimierung der Punkt umstritten, wie die meisten, wenn nicht alle Komprimierungsmethoden hängen stark von Inhalten ab, die zuvor in der Datei aufgetreten sind. Um dies zu tun, benötigen Sie sehr detaillierte Kenntnisse sowohl über die Komprimierungsmethode als auch über das Tar-Dateiformat. Das ist Komplexität bis zu einem Punkt, an dem sich niemand mehr darum kümmern würde. Es ist billiger, nur die Dateien zu behalten und sie zu ignorieren.

Wenn Sie diese Funktionalität benötigen, ist tar wahrscheinlich nicht das, was Sie wollen.

Frostschutz
quelle
Diese Dateien machen 35% der Archivgröße aus. Die Einschränkungen, auf die Sie anscheinend hinweisen, gelten nur, wenn ich die Datei umschreibe , nicht, wenn ich sie an einem anderen Ort ändere, was ich tun kann (ich habe genug Platz, um das gepackte Archiv zweimal zu speichern ). Gibt es so ein Tool?
FUZxxl
Vielleicht habe ich Ihre Frage dann falsch verstanden. Wenn Sie bereit sind, den Teer zu entpacken und erneut zu packen (nur ohne die geteerten Dateien zu erstellen - dh eine direkte Teer-zu-Teer-Pipe), ist dies möglicherweise möglich.
Frostschutz
Ja, das kann ich machen. Es ist nur so, dass die Dateien UIDs / GIDs / Attribute haben, die ich bewahren muss. Außerdem ist nicht genügend Speicherplatz vorhanden, um die entpackte Darstellung zu speichern. Ich habe aber genug Platz, um zwei gepackte Archive zu speichern.
FUZxxl
1
Das ist überhaupt kein Problem. Wenn ich das in einem Durchgang schaffe, wird die Zeit nicht zu lang. Ich kann mir kein Archivformat vorstellen, das ein schnelles Löschen ermöglicht, während tatsächlich Speicher freigegeben wird.
FUZxxl
1
--wildcardsHilfe ... Ich musste zu ./Beginn des Musters allerdings einbeziehen ...
Gert van den Berg
14

GNU tar hat eine --deleteOption, die heutzutage auch mit Archiven funktioniert.

Verwenden Sie es wie folgt, zum Beispiel:

tar -vf yourArchive.tar --delete your/path/to/delete

Achtung: Es wird höchstwahrscheinlich nicht auf jede Art von Magnetbandmedium arbeiten. Hat taraber keine Probleme in einer Pipe zu arbeiten, so kann man einfach eine temporäre tar-Datei verwenden und das Band danach damit überschreiben. Es funktioniert auch nicht bei komprimierten Dateien, daher müssten Sie die Datei dekomprimieren.

Aufgrund der (konstruktionsbedingt) gepackten Linearität von Teerarchiven ist der Vorgang in jedem Fall eher langsam.

Evi1M4chine
quelle
1
Es gibt es, aber es funktioniert nicht mit Dateien, auf die kein wahlfreier Zugriff möglich ist (z. B. Archive komprimieren), aber dies ist mein Anwendungsfall.
FUZxxl
1
Das andere Problem ist, dass ich kein zu löschendes Muster angeben kann. Beachten Sie meinen Kommentar aus dem Jahr 2013, in dem ich bereits auf die Mängel von eingegangen bin gtar --delete.
FUZxxl
3
@FUZxxl -Tfunktioniert mit --deleteund --wildcardsermöglicht es Ihnen, Muster anstelle von Dateinamen zu verwenden. Erstellen Sie daher eine temporäre Datei, die die Muster enthält, und verwenden Sie sie unxz < file.tar.xz | tar --wildcards --delete -T patternfile | xz > file2.tar.xz. Es wird kein vollständiger regulärer Ausdruck ausgeführt (wenn Sie dies benötigen, verwenden Sie einfach tar -teine Liste der zu löschenden Dateinamen und erstellen Sie sie).
Random832
-4

Laut Handbuch können Sie eine Liste von Dateinamen übergeben, tarum nur diese zu extrahieren. Beispielsweise:

$ tar --file archive.tar --list
foo
bar
baz

$ tar --file archive.tar --extract foo
Don Juan dePython
quelle
Ich verstehe nicht, wie --extract mir hilft. Könnten Sie näher darauf eingehen? Bitte beachten Sie, dass ich das Archiv (oder wesentliche Teile davon) nicht auf die Festplatte entpacken kann.
FUZxxl
2
Bitte posten Sie nicht nur Links: Dies ist ein Wiki - fügen Sie genügend Inhalte hinzu, damit die Benutzer die Seite nicht verlassen müssen, um Ihre Antwort zu verstehen.
Jasonwryan