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/file
scheint 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.txt
ignore.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?
Antworten:
Leider müssen Sie zum Entpacken eines einzelnen
.tar.gz
Archivmitglieds 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 daszip
Format ein zentrales Verzeichnis aller darin enthaltenen Dateien mit direkten Offsets aufweist, die auf die Mitte derzip
Datei verweisen , sodass Archivmitglieder schnell extrahiert werden können, ohne das Ganze zu verarbeiten.Sie fragen sich vielleicht, warum die Verarbeitung
.tar.gz
so langsam ist?.tar.gz
(oft abgekürzt als.tgz
) wird einfach.tar
mitgzip
Compressor komprimiert archiviert .gzip
Streaming-Kompressor, der nur mit einer Datei arbeiten kann. Wenn Sie einen Teil davon zu bekommen , wollengzip
Strom, haben Sie es als Ganzes zu dekomprimieren, und das ist , was tötet es wirklich für.tar.gz
(und.tar.bz2
,.tar.xz
und andere ähnliche Formate basieren auf.tar
)..tar
Format 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.tar
Archivs.Einige Leute denken, dass nicht einmal
.tar
Archivmitglieder schnell darauf zugreifen können, aber das ist nicht ganz richtig. Wenn das.tar
Archiv 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.tar
Archiv viele winzige Dateien enthält, ist ein schneller Abruf von Mitgliedern auch ohne Komprimierung praktisch nicht möglich.tar
.quelle
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
Spoolt nicht durch den gesamten Tarball, nachdem eine Kopie von jedem von
passwd
und gefunden wurdeshadow
, 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
tar
Single-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=NUMBER
das Auftreten jeder Datei abzurufen, die , wenn Sie hilft wissen , dass es gibt mehrere Versionen im Archiv. Standardmäßig ist das Verhalten gleich aNUMBER
von 1.quelle
--occurrence
wü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?tar
der Tarball weiterhin nach neueren Versionen einer gefundenen Datei durchsucht wird. Stattdessen gibt sie, wie der Mann Seite sagtthe Nth occurrence
. Wenn Sie eine zu extrahierende Datei in der Befehlszeile angeben und sagen, dass--occurrence
tar beendet wird, sobald es diese Datei gefunden hat, und somit effektiv bei der "ersten Datei" anhält.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.
quelle
Wenn Sie mit einem großen Tarball arbeiten, verwenden Sie:
Der obige Befehl sucht, bis er eine Übereinstimmung findet, und beendet dann den Vorgang
quelle
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-read
anders ist als--occurrence
. Aber dann--occurrence
steht ja noch nicht auf der Ubuntu-Seite, sondern es ist drinman tar
. Sind--fast-read
und--occurrence
dasselbe möglich?