Gibt es ein intelligenteres tar oder cpio, um eine im Archiv gespeicherte Datei effizient abzurufen?

24

Ich verwende, tarum eine Gruppe sehr großer (Multi-GB) bz2Dateien zu archivieren .

Das tar -tf file.tarAuflisten der Dateien im Archiv dauert sehr lange (~ 10-15 Minuten).

Ebenso cpio -t < file.cpiodauert es genauso lange, plus oder minus ein paar Sekunden.

Entsprechend tar -xf file.tar myFileOfInterest.bz2langsam ist das Abrufen einer Datei aus einem Archiv ( beispielsweise über).

Gibt es eine Archivierungsmethode, die einen sofort verfügbaren "Katalog" mit dem Archiv führt, sodass eine einzelne Datei innerhalb des Archivs schnell abgerufen werden kann?

Zum Beispiel eine Art Katalog, der einen Zeiger auf ein bestimmtes Byte im Archiv sowie die Größe der abzurufenden Datei (sowie andere dateisystemspezifische Angaben) speichert.

Gibt es ein Tool (oder ein Argument für taroder cpio), mit dem eine Datei im Archiv effizient abgerufen werden kann?

Alex Reynolds
quelle

Antworten:

15

tar (und cpio und afio und pax und ähnliche Programme) sind stream-orientierte Formate - sie sollen direkt auf ein Band gestreamt oder in einen anderen Prozess geleitet werden. Obwohl es theoretisch möglich wäre, einen Index am Ende der Datei / des Streams hinzuzufügen, kenne ich keine Version, die dies tut (es wäre jedoch eine nützliche Verbesserung).

Es hilft nicht bei Ihren vorhandenen tar- oder cpio-Archiven, aber es gibt ein anderes Tool, dar ("Plattenarchiv"), das Archivdateien erstellt, die einen solchen Index enthalten, und Ihnen einen schnellen direkten Zugriff auf einzelne Dateien im Archiv ermöglicht .

wenn dar nicht in deiner unix / linux-dist enthalten ist, findest du es unter:

http://dar.linux.free.fr/

cas
quelle
Gibt es eine Möglichkeit, eine Extraktion an die Standardausgabe weiterzuleiten? Es sieht so aus, als gäbe es eine Möglichkeit, ein Archiv aus der Standardeingabe zu erstellen, aber keine Möglichkeit (zumindest nicht direkt), es in die Standardausgabe zu extrahieren. Aus der Dokumentation geht nicht hervor, ob es eine Möglichkeit gibt, dies zu tun. Wissen Sie, wie dies erreicht werden könnte?
Alex Reynolds
1
Nein, weiß nicht. Ich benutze dar selbst nicht ... ich weiß nur, dass es existiert. Ich bin mit tar zufrieden und erstelle in der Regel nur Textdateien, in denen der Inhalt für große tar-Dateien aufgeführt ist, die ich später möglicherweise durchsuchen möchte. Sie können dies gleichzeitig mit dem zweimaligen Erstellen des Tar-Archivs mit der Option v tun (z. B. "tar cvvjf /tmp/foo.tar.bz2 / path / to / backup> /tmp/foo.txt")
cas
10

Sie können SquashFS für solche Archive verwenden. Es ist

  • für den Zugriff mit einem Sicherungstreiber konzipiert (obwohl eine herkömmliche Schnittstelle vorhanden ist)
  • komprimiert (je größer der Block, desto effizienter)
  • im Linux-Kernel enthalten
  • speichert UIDs / GIDs und Erstellungszeit
  • Endianess-bewusst, daher recht portabel

Der einzige Nachteil, den ich kenne, ist, dass es schreibgeschützt ist.

http://squashfs.sourceforge.net/ http://www.tldp.org/HOWTO/SquashFS-HOWTO/whatis.html

MauganRa
quelle
8

Es speichert zwar keinen Index, starsoll aber schneller sein als tar. Außerdem werden längere Dateinamen und Dateiattribute besser unterstützt.

Wie Sie sicher wissen, dauert das Dekomprimieren der Datei einige Zeit und ist wahrscheinlich ein Faktor für die Geschwindigkeit des Extrahierens, selbst wenn ein Index vorhanden wäre.

Bearbeiten: Vielleicht möchten Sie auch einen Blick darauf werfen xar. Es hat einen XML-Header, der Informationen zu den Dateien im Archiv enthält.

Von der referenzierten Seite:

Mit dem XML-Header von Xar können beliebige Metadaten zu Dateien im Archiv gespeichert werden. Zusätzlich zu den Standard-Metadaten für Unix-Dateien wie der Größe der Datei und den Änderungs- und Erstellungszeiten kann xar Informationen wie ext2fs- und hfs-Dateibits, Unix-Flags, Verweise auf erweiterte Attribute, Mac OS X Finder-Informationen und Mac OS speichern X Resource Forks und Hashes der Dateidaten.

Bis auf weiteres angehalten.
quelle
+1, um mich auf ein nützliches Tool aufmerksam zu machen, von dem ich noch nie zuvor gehört hatte.
cas
Link von starist down ......
Pacerier
5

Thorbjørn Ravn Anderser hat recht. GNU tar erstellt standardmäßig "durchsuchbare" Archive. Diese Informationen werden jedoch beim Lesen dieser Archive nicht verwendet, wenn die Option -n nicht angegeben ist. Mit der Option -n habe ich gerade eine 7-GB-Datei aus einem 300-GB-Archiv extrahiert, die zum Lesen / Schreiben von 7-GB-Dateien benötigt wird. Ohne -n ​​dauerte es mehr als eine Stunde und brachte kein Ergebnis.

Ich bin nicht sicher, wie sich die Komprimierung darauf auswirkt. Mein Archiv wurde nicht komprimiert. Komprimierte Archive sind nicht "suchbar", da der aktuelle (1.26) GNU-Teer die Komprimierung in ein externes Programm verlagert.

Aidas Kasparas
quelle
Laut der Manpage " tar" von man7.org/linux/man-pages/man1/tar.1.html verwendet GNU tar beim Schreiben standardmäßig das Format "seekable". Wenn das Archiv suchbar ist, wird es beim Lesen (z Liste oder Auszug). Wenn Sie GNU tar verwenden und das Problem weiterhin sehen, sollten Sie einen Fehlerbericht bei GNU einreichen.
Brian Minton
6
Wenn ich das Handbuch richtig lese, sagt es nie, dass es irgendeine Art von Index hat, und kann unter Angabe des Dateinamens zu jeder Datei innerhalb des Archivs springen. --seek bedeutet nur, dass das zugrunde liegende Medium gesucht werden kann, sodass beim Lesen von Anfang an der Inhalt der Datei übersprungen werden kann, die Header der Einträge jedoch weiterhin von Anfang an gelesen werden müssen. Das heißt, wenn Sie ein Archiv mit 1M-Dateien haben und versuchen, das letzte mit --no-seek zu extrahieren, müssen Sie den Inhalt aller Dateien lesen. mit --seek müssen Sie nur 1 Million Header lesen, einen für jede Datei, aber es ist immer noch sehr langsam.
Icando
4

Das einzige Archivformat, von dem ich weiß, dass es einen Index speichert, ist ZIP, weil ich beschädigte Indizes mehr als einmal rekonstruieren musste.

womble
quelle
2

Es indiziert nicht, wovon ich weiß, aber ich verwende dump & restore bei großen Dateien, und das Navigieren im Wiederherstellungsbaum im interaktiven Modus, um zufällige Dateien auszuwählen, ist SEHR schnell.

MediaManNJ
quelle
2

Sie können das Archiv- / Komprimierungsformat 7z (7zip) verwenden, wenn Sie Zugriff auf das p7zip-fullPaket haben.

Unter Ubuntu können Sie diesen Befehl verwenden, um es zu installieren:

$ sudo apt-get install p7zip-full

Um ein Archiv zu erstellen, das Sie verwenden können, 7z a <archive_name> <file_or_directory>und wenn Sie die Dateien nicht komprimieren und nur so speichern möchten, wie sie sind, können Sie die folgende -mx0Option verwenden:

$ 7z a -mx0 myarchive.7z myfile.txt

Creating archive myarchive.7z

Sie können die Dateien dann extrahieren, indem Sie Folgendes verwenden 7z e:

$ 7z e myarchive.7z

Processing archive: myarchive.7z
Extracting  myfile.txt

Oder Sie listen den Index des Archivs mit dem auf, mit dem Sie 7z lsuchen können grep:

$ 7z l myarchive.7z | grep

2014-07-08 12:13:39 ....A            0            0  myfile.txt

Dies ist auch die tOption zum Testen der Integrität, uzum Hinzufügen / Aktualisieren einer Datei zum Archiv und dzum Löschen einer Datei.

WICHTIGER HINWEIS
Do nicht verwenden , um das 7 - Zip - Format für Linux - Dateisystem - Backups , da es nicht den Besitzer speichert und Gruppe der enthaltenen Dateien.

kompliziert
quelle
Für Linux wäre es in Ordnung, eine TAR-Datei zu 7zippen.
Thorbjørn Ravn Andersen
1

Ich glaube, dass GNU Teer in der Lage ist, das zu tun, was Sie wollen, aber ich kann keine definitive Ressource finden, die dies sagt.

In jedem Fall benötigen Sie ein Archivierungsformat mit einem Index (da Sie damit tun können, was Sie wollen). Ich glaube nicht, dass ZIP-Dateien so groß werden können, leider.

Thorbjørn Ravn Andersen
quelle
ZIP-Dateien können sehr groß werden .
Pacerier
1
Wenn ich das Handbuch richtig lese, sagt es nie, dass es irgendeine Art von Index hat, und kann unter Angabe des Dateinamens zu jeder Datei innerhalb des Archivs springen. --seek bedeutet nur, dass das zugrunde liegende Medium gesucht werden kann, sodass beim Lesen von Anfang an der Inhalt der Datei übersprungen werden kann, die Header der Einträge jedoch weiterhin von Anfang an gelesen werden müssen. Das heißt, wenn Sie ein Archiv mit 1M-Dateien haben und versuchen, das letzte mit --no-seek zu extrahieren, müssen Sie den Inhalt aller Dateien lesen. mit --seek müssen Sie nur 1 Million Header lesen, einen für jede Datei, aber es ist immer noch sehr langsam.
Icando
2
@Pacerier Meines Wissens erlaubt das ZIP64-Format sehr große Dateien, das ursprüngliche ZIP-Format jedoch nicht.
Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen, Eine einzelne 4 GB- Datei ist ein großer Typ.
Pacerier
3
@Pacerier 4GB war nicht groß, seit vor fast zwanzig Jahren DVD-ISOs auf den Markt kamen. Terrabytes sind heutzutage groß.
Oligofren