Zusätzlich zu dem, was vorher von Grawity und Paul gesagt wurde :
Geschichte
In den "alten Zeiten" war cpio (mit der verwendeten Option -c
) das Werkzeug, das zum Verschieben von Dateien in andere UNIX-Derivate verwendet werden sollte, da es portabler und flexibler war als tar . Die Probleme mit der Teerportabilität können jedoch seit den späten achtziger Jahren als gelöst gelten.
Unglücklicherweise war es zu dieser Zeit, dass verschiedene Hersteller das -c
Format von cpio durcheinander gebracht hatten (siehe die Manpage zu GNU cpio und die Option -H
). Damals war tar mehr portabel als cpio ... Es dauerte fast ein ganzes Jahrzehnt, bis die verschiedenen UNIX-Anbieter das Problem gelöst hatten. Die Installation von GNU tar und GNU cpio war ein Muss für alle Admins, die sich damals mit Bändern aus verschiedenen Quellen befassen mussten (selbst ich nehme an, dass dies heutzutage der Fall ist).
Benutzeroberfläche
tar kann eine Bandkonfigurationsdatei verwenden, in der der Administrator die an das System angeschlossenen Bandlaufwerke konfigurieren würde. Der Benutzer würde dann einfach sagen "Nun, ich nehme Bandlaufwerk 1", anstatt sich an den genauen Geräteknoten für das Band zu erinnern (was sehr verwirrend sein kann und auch nicht auf verschiedenen UNIX-Plattformen standardisiert ist).
Der Hauptunterschied ist jedoch:
tar kann Verzeichnisse selbst durchsuchen und nimmt die Liste der zu sichernden Dateien oder Verzeichnisse anhand von Befehlszeilenargumenten an.
cpio archiviert nur die Dateien oder Verzeichnisse, denen es mitgeteilt wird, durchsucht aber Unterverzeichnisse nicht selbst rekursiv. Auch cpio wird die Liste der Elemente von zu archivier stdin - deshalb ist es fast immer mit in Kombination verwendet finden .
Ein cpio- Befehl sieht für Anfänger im Vergleich zu Teer 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 Benutzer tar verwenden, um Archivdateien zu erstellen: Für einfache Aufgaben wie das Bündeln eines vollständigen Verzeichnisses ist es einfacher zu bedienen.
Auch GNU tar bietet die Möglichkeit -z
, das Archiv mit GNU zip im laufenden Betrieb zu komprimieren, was die Sache noch einfacher macht.
Andererseits kann man mit find & cpio nette Dinge machen . Tatsächlich handelt es sich dabei eher um einen UNIX-ähnlichen Ansatz: Warum sollten Sie die Verzeichnisbaumsuche in cpio einschließen, wenn es bereits ein Tool gibt, das sich um fast alles kümmert, was Sie sich vorstellen können: find . Dinge, die mir in den Sinn kommen, sichern nur Dateien, die neuer als ein bestimmtes Datum sind, beschränken die Dateien auf diejenigen, die sich im selben Dateisystem befinden, oder filtern die find-output mit grep -v
, um bestimmte Dateien auszuschließen ...
Die Leute von GNU tar haben viel Arbeit investiert, um viele Dinge aufzunehmen, die bisher nur mit cpio möglich waren . Tatsächlich haben beide Tools voneinander gelernt - aber nur cpio kann das Format von tar lesen - nicht umgekehrt.
Teer- und Ausgabeverarbeitung
Eine letzte Anmerkung zu etwas, das Sie gesagt haben:
Mir wurde auch gesagt, TAR kann nicht von STDOUT komprimiert werden. Ich möchte ZFS-Momentaufnahmen für Backups archivieren / komprimieren. Ich habe mich gefragt, ob ich CPIO mit bzip2 kombinieren könnte, 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 Archivnamen:
$ tar cvf - myfiles | bzip > myfiles.tar.bz
Auch GNU tar bietet die Möglichkeit, --to-command
einen Post - Prozessor - Befehl angeben - obwohl ich würde immer noch das Rohr bevorzugen. Vielleicht ist es hilfreich beim Schreiben auf bestimmte Hardwaregeräte.