Ich bin neugierig und habe ein bisschen gelesen, habe aber noch Fragen.
Was unterscheidet CPIO von TAR? In einer anderen Frage wurde mir gesagt, dass mit tar viele Dateien zu einem Archiv zusammengefasst werden sollen, das dann normalerweise gzip'd oder bzip'd ist.
Außerdem wurde mir mitgeteilt, dass TAR von STDOUT nicht komprimiert werden kann. Ich möchte ZFS-Snapshots für Backups archivieren/komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren kann, um diesen Effekt zu erzielen.
Oder habe ich die völlig falsche Vorstellung? Ist das nicht der Zweck des CPIO?
Dies ist die Art von Befehlen, die ich nach dem Lesen aufgerufen habe, damit Oracle Dokumente zum Sichern von ZFS-Snapshots erstellt.
# Backup snapshot to cpio and bzip2 archive
zfs send media/[email protected] | cpio -o | bzip2 -9c > ~/backups/20070607.bz2
# Restore snapshot from cpio and bzip2 archive
zfs recieve media/[email protected] | cpio -i | bunzip2 -c ~/backups/20070607.bz2
Sowohl tar
als auch cpio
haben einen einzigen Zweck: viele separate Dateien zu einem einzigen Stream zu verketten. Sie komprimieren keine Daten. (Heutzutage ist tar
aufgrund seiner relativen Einfachheit populärer - es kann Eingabedateien als Argumente verwenden, anstatt mit find
wie cpio
gekoppelt zu werden.)
In Ihrem Fall benötigen Sie keines dieser Tools . Sie hätten keinen nützlichen Effekt, da Sie nicht viele separate Dateien haben . zfs send
hat bereits dasselbe getan wie tar
. Sie haben also keine Dateien , nur ein namenloser Stream.
Um den Schnappschuss zu komprimieren, müssen Sie lediglich die Ausgabe von zfs
durch ein Komprimierungsprogramm leiten:
zfs send media/[email protected] | gzip -c > ~/backups/20070607.gz
gzip -dc ~/backups/20070607.gz | zfs receive media/[email protected]
(Sie können gzip
durch xz
oder bzip2
oder ein anderes Stream-Komprimierungs-Tool ersetzen, wenn Sie möchten.)
Zusätzlich zu dem, was zuvor von grawity und Paul gesagt wurde:
Geschichte
In den "alten Tagen" war cpio (mit der Option -c
) das zu verwendende Tool Verschieben von Dateien auf andere UNIX-Derivate, da diese portabler und flexibler als tar waren. Die tar -Portabilitätsprobleme können jedoch seit den späten 1980er Jahren als gelöst angesehen werden.
Unglücklicherweise war es ungefähr zu dieser Zeit, dass verschiedene Hersteller das -c
-Format von cpio zerrissen haben (schauen Sie einfach in die Handbuchseite für GNU cpio und die Option -H
). Zu dieser Zeit wurde tar portabler als cpio ... Es dauerte fast ein ganzes Jahrzehnt, bis die verschiedenen UNIX-Anbieter das geklärt hatten. GNU tar und GNU cpio installiert zu haben, war ein Muss für alle Administratoren, die sich damals mit Bändern aus verschiedenen Quellen befassen mussten (auch heutzutage nehme ich an). .
Benutzeroberfläche
tar verwendet möglicherweise eine Bandkonfigurationsdatei, in der der Administrator die mit dem System verbundenen Bandlaufwerke konfiguriert. Der Benutzer würde dann einfach "Nun, ich nehme Bandlaufwerk 1" sagen, anstatt sich den genauen Geräteknoten für das Band merken zu müssen (was sehr verwirrend sein kann und auch auf verschiedenen UNIX-Plattformen nicht standardisiert ist.
Der Hauptunterschied ist jedoch:
tar kann Verzeichnisse eigenständig durchsuchen und verwendet die Liste der zu sichernden Dateien oder Verzeichnisse aus Befehlszeilenargumenten.
cpio archiviert nur die Dateien oder Verzeichnisse, denen es befohlen wurde, durchsucht die Unterverzeichnisse jedoch nicht rekursiv. Außerdem ruft cpio die Liste der zu archivierenden Elemente von stdin ab - daher wird es fast immer in Kombination mit find verwendet .
Ein cpio -Befehl sieht für den Anfänger im Vergleich zu tar oft furchterregend aus:
$ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
$ tar czvf myfiles.tar.gz myfiles
Ich denke, das ist der Hauptgrund, warum die meisten Leute tar verwenden, um Archivdateien zu erstellen: Für einfache Aufgaben wie das Bündeln eines vollständigen Verzeichnisses ist es einfach einfacher zu verwenden.
Außerdem bietet GNU tar die Option -z
, mit der das Archiv im laufenden Betrieb mit GNU Zip komprimiert wird, was die Sache noch einfacher macht.
Andererseits kann man mit find & cpio raffinierte Dinge machen. Tatsächlich handelt es sich eher um einen UNIX-ähnlichen Ansatz: Warum sollte die Verzeichnisbaumsuche in cpio aufgenommen werden, wenn es bereits ein Tool gibt, das fast alle Aufgaben erledigt, die man sich vorstellen kann: find . Dinge, die mir in den Sinn kommen, sind nur das Sichern von Dateien, die neuer sind als ein bestimmtes Datum, das Einschränken der Dateien auf diejenigen, die sich im selben Dateisystem befinden oder das Filtern der Find-Ausgabe mit grep -v
, um bestimmte Dateien auszuschließen ...
Die Leute von GNU tar haben viel Arbeit investiert, um viele der Dinge aufzunehmen, die vorher nur mit cpio möglich waren. Tatsächlich haben beide Tools voneinander gelernt - aber nur cpio kann das Format von tar lesen - und nicht umgekehrt.
tar und Ausgabeverarbeitung
Eine letzte Anmerkung zu etwas, das Sie gesagt haben:
Außerdem wurde mir mitgeteilt, dass TAR von STDOUT nicht komprimiert werden kann. Ich möchte ZFS-Snapshots für Backups archivieren/komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren kann, um diesen Effekt zu erzielen.
Nun, jede Version von tar (GNU oder nicht) kann in einer Pipe verwendet werden. Verwenden Sie einfach ein Minuszeichen (-
) als Archivname:
$ tar cvf - myfiles | bzip > myfiles.tar.bz
Außerdem bietet GNU tar die Option --to-command
, um einen Postprozessor-Befehl anzugeben - obwohl ich die Pipe immer noch vorziehen würde. Vielleicht ist es hilfreich, wenn Sie auf bestimmte Hardwaregeräte schreiben.
tar und cpio haben im Wesentlichen dieselbe Funktion: Sie erstellen eine einzige zusammenhängende Datei aus einer Eingabe mehrerer Dateien und Verzeichnisse. Ursprünglich diente dies dazu, das Ergebnis auf Band zu bringen, aber heutzutage wird es im Allgemeinen verwendet, um ein Komprimierungsdienstprogramm wie oben beschrieben zu verwenden. Dies liegt daran, dass das Komprimieren einer einzelnen großen Datei sowohl zeit- als auch platzsparender ist als das Komprimieren vieler kleiner Dateien. Sie sollten beachten, dass viele Bildformate (PNG, JPG usw.) bereits stark komprimiert sind und möglicherweise sogar etwas größer werden, wenn sie mit einem Komprimierungsprogramm erstellt werden.
Weder tar noch cpio machen selbst eine Komprimierung. Tar hat den Krieg "Was sollen wir verwenden, um aggregierte Dateien zu erstellen" effektiv "gewonnen", aber cpio bekommt an verschiedenen Stellen einen Lookin. Mir sind keine Vorteile des einen gegenüber dem anderen bekannt, Teer gewinnt dadurch, dass er häufiger verwendet wird.
tar kann in der Tat die Eingabe von stdin und die Ausgabe von stdout übernehmen - was dann in bzip2 weitergeleitet wird, wie Sie es getan haben oder so ähnlich. Bei Aufruf mit der Option "z" wird automatisch gzip für die Ausgabe aufgerufen.
Ich habe einen HP-Kundendienst in ca. gefragt. 1996 warum sollte man cpio
anstelle von tar
verwenden?.
Mir wurde gesagt, dass sich Bänder dehnen und abnutzen. Wenn tar
einen nicht lesbaren Teil des Bandes erreicht, schlägt dies fehl und gibt die Fehlernummer zurück. Wenn cpio
einen unlesbaren Teil erreicht, wird der nächste lesbare Block erneut synchronisiert und fortgesetzt.
Ich habe noch nie eine Dokumentation gesehen, die dies unterstützt, aber immer cpio
verwendet.
Ebenfalls erwähnenswert: Unter (mindestens) FreeBSD und Mac OS X können Sie cpio-Dateien mit tar bearbeiten. BSD tar benutzt libarchive unter der Haube, damit es mit cpio, pax, shar ... umgehen kann.
Dies bedeutet, dass die Usability-Probleme des Befehls cpio
Sie nicht daran hindern müssen, mit cpio-Dateien zu interagieren.
Während die Antworten hier bereits cpio
und tar
sehr gut vergleichen, möchte ich eine der Funktionen von cpio
hervorheben, die als Pipeline-Modus bezeichnet werden und das Kopieren ausgewählter Dateien (d. H. Über find
und Filter) unter Beibehaltung ihrer Verzeichnisstruktur effizienter macht. Diese Funktion ist gut dokumentiert und sieht im Grunde so aus:
find . <predicates> | cpio -pdmv /destination/dir
Das Äquivalent mit tar
würde ungefähr so aussehen:
find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)
Es gibt natürlich andere Alternativen wie rsync
und cp --parents
, die in einem anderen Thread diskutiert werden, aber nichts kommt der Flexibilität nahe, die die Kombination von find
und cpio
bietet. Da tar
für die Erstellung von Archiven allgegenwärtig ist, ist dies der einzige Grund, aus dem ich noch cpio
verwende.