einzelne datei aus einer riesigen tgz datei extrahieren

19

Ich habe eine riesige TAR-Datei (ca. 500G) und möchte nicht nur eine einzige Datei daraus extrahieren.
Beim Ausführen tar -xvf file.tgz path/to/filescheint es jedoch, als würde der gesamte Inhalt immer noch in den Speicher geladen, und das Extrahieren dauert über eine Stunde. Ich habe auch versucht, --exclude=ignore.txtignore.txt als Musterliste zu verwenden , um zu verhindern, dass er sinnlose Pfade durchläuft, aber das scheint nicht zu funktionieren.

Vielleicht verstehe ich tar nicht ... Gibt es eine Möglichkeit, die Datei schnell zu extrahieren?

Brian
quelle
Ich wundere mich über das selbe. Die von mir
gesuchte

Antworten:

14

Leider müssen Sie zum Entpacken eines einzelnen .tar.gzArchivmitglieds das gesamte Archiv verarbeiten, und Sie können nicht viel tun, um es zu reparieren.

Hier arbeiten .zip(und einige andere Formate wie .rar) Archive viel besser, da das zipFormat ein zentrales Verzeichnis aller darin enthaltenen Dateien mit direkten Offsets aufweist, die auf die Mitte der zipDatei verweisen , sodass Archivmitglieder schnell extrahiert werden können, ohne das Ganze zu verarbeiten.

Sie fragen sich vielleicht, warum die Verarbeitung .tar.gzso langsam ist?

.tar.gz(oft abgekürzt als .tgz) wird einfach .tarmit gzipCompressor komprimiert archiviert . gzipStreaming-Kompressor, der nur mit einer Datei arbeiten kann. Wenn Sie einen Teil davon zu bekommen , wollen gzipStrom, haben Sie es als Ganzes zu dekomprimieren, und das ist , was tötet es wirklich für .tar.gz(und .tar.bz2, .tar.xzund andere ähnliche Formate basieren auf .tar).

.tarFormat ist eigentlich sehr, sehr einfach. Es handelt sich lediglich um einen Stream von 512-Byte-Datei- oder -Verzeichnis-Headern (Name, Größe usw.), gefolgt von Datei- oder Verzeichnisinhalten (bei Bedarf mit 0 Byte auf 512-Blockgröße aufgefüllt). Wenn Sie für einen Header einen Block von insgesamt null 512 beobachten, bedeutet dies das Ende des .tarArchivs.

Einige Leute denken, dass nicht einmal .tarArchivmitglieder schnell darauf zugreifen können, aber das ist nicht ganz richtig. Wenn das .tarArchiv nur wenige große Dateien enthält, können Sie tatsächlich schnell in den nächsten Header suchen und so das erforderliche Archivmitglied in wenigen Suchvorgängen finden (es können jedoch immer noch so viele Suchvorgänge erforderlich sein, wie Archivmitglieder vorhanden sind). Wenn Ihr .tarArchiv viele winzige Dateien enthält, ist ein schneller Abruf von Mitgliedern auch ohne Komprimierung praktisch nicht möglich .tar.

mvp
quelle
3
gzip kann unkomprimierte Daten streamen, es muss nicht alles rückgängig gemacht werden. Da .tar die Abkürzung für Tape Archive ist, müssen Sie die gesamte Datei durchlaufen, bis Sie die gesuchte Datei gefunden haben. Obwohl tar weiter sucht, weil möglicherweise eine andere vorhanden ist, kopieren Sie diese später in die tar-Datei.
Kurtm
9

Wenn Sie nur eine Datei aus einer großen TAR-Datei extrahieren, verwenden Sie GNU tar, und Sie können garantieren, dass die TAR-Datei nie angehängt wurde. Dann können Sie einen erheblichen Leistungsschub erzielen, indem Sie verwenden --occurrence.

Diese Option weist tar an, anzuhalten, sobald es das erste Vorkommen jeder von Ihnen angeforderten Datei findet, z

tar xf large-backup.tar --occurrence etc/passwd etc/shadow

Spoolt nicht durch den gesamten Tarball, nachdem eine Kopie von jedem von passwdund gefunden wurde shadow, sondern stoppt. Wenn diese Dateien gegen Ende angezeigt werden, ist der Leistungsgewinn nicht viel, aber wenn sie auf halbem Weg durch eine 500G-Datei angezeigt werden, sparen Sie viel Zeit.

Für Benutzer, die tarSingle-Shot-Backups durchführen und keine echten Bandlaufwerke verwenden, ist diese Situation wahrscheinlich der typische Fall.

Beachten Sie, dass Sie auch passieren können --occurrence=NUMBERdas Auftreten jeder Datei abzurufen, die , wenn Sie hilft wissen , dass es gibt mehrere Versionen im Archiv. Standardmäßig ist das Verhalten gleich a NUMBERvon 1.

phogg
quelle
Gibt es eine Möglichkeit, den Teer so zu erstellen, dass zuerst eine bestimmte Datei ausgegeben wird? das --occurrencewürde also sofort bei der ersten datei ansetzen? Ich vermute, es geht um Dateinamen, also würde zum Beispiel etwas mit dem Namen aaaaa.jpg zuerst herauskommen?
Jeff
1
@ Jeff: Nicht wirklich. Dies verhindert lediglich, dass tarder Tarball weiterhin nach neueren Versionen einer gefundenen Datei durchsucht wird. Stattdessen gibt sie, wie der Mann Seite sagt the Nth occurrence. Wenn Sie eine zu extrahierende Datei in der Befehlszeile angeben und sagen, dass --occurrencetar beendet wird, sobald es diese Datei gefunden hat, und somit effektiv bei der "ersten Datei" anhält.
Phogg
1

Leider enthält das tar-Dateiformat kein zentrales Inhaltsverzeichnis. Daher muss das Archiv nacheinander gelesen werden, um eine bestimmte Datei zu finden. Es wurde ursprünglich für Bandsicherungen entwickelt ("tar" stammt von t ape ar chive), die eine solche Operation auf keinen Fall unterstützt hätten.

Sie müssen also wahrscheinlich nur warten.

user55325
quelle
1

Wenn Sie mit einem großen Tarball arbeiten, verwenden Sie:

--fast-readpath/to/fileIn diesem Fall wird nur der erste Archiveintrag extrahiert, der mit dem Dateinamenoperanden übereinstimmt - der in Tarball ohnehin immer eindeutig ist

tar -xvf file.tgz --fast-read path/to/file

Der obige Befehl sucht, bis er eine Übereinstimmung findet, und beendet dann den Vorgang

Ryan
quelle
1
Ich wollte verstehen, warum dies immer noch bei 0 Punkten liegt. man tar(GNU tar 1.29) druckt diese Option nicht einmal aus. Ubuntu scheint es jedoch standardmäßig aktiviert zu haben . Wenn ich schnell lese, bin ich mir nicht sicher, was --fast-readanders ist als --occurrence. Aber dann --occurrencesteht ja noch nicht auf der Ubuntu-Seite, sondern es ist drin man tar. Sind --fast-readund --occurrencedasselbe möglich?
Jeff
Keine dieser Optionen ist im Standard festgelegt, und wie immer bei nicht standardmäßigen Optionen muss darauf geachtet werden, dass das Dienstprogramm auf Ihrem System sie unterstützt. Die Option --occurrences wird von GNU tar unterstützt. Die Option --fast-read wird von neueren Versionen von FreeBSD tar unterstützt, die von Ubuntu als bsdtar gepackt wurden. Sehen Sie hier für mehr.
Phogg