Je suis curieux et j'ai lu un peu, mais j'ai encore des questions.
Qu'est-ce qui différencie CPIO de TAR? On m'a dit dans une autre question que tar servait à rassembler de nombreux fichiers dans une archive, qui est alors généralement gzip'd ou bzip'd.
De plus, on m'a dit que TAR ne pouvait pas compresser à partir de STDOUT. Je souhaite archiver/compresser des instantanés ZFS pour les sauvegardes. Je me demandais si je pouvais combiner CPIO avec bzip2 pour obtenir cet effet.
Ou est-ce que j'ai une idée complètement fausse? N'est-ce pas le but de CPIO?
C’est le genre de commande que j’ai eu à lire après avoir lu les documents afin de permettre à Oracle de sauvegarder les instantanés ZFS.
# Backup snapshot to cpio and bzip2 archive
zfs send media/mypictures@20070607 | cpio -o | bzip2 -9c > ~/backups/20070607.bz2
# Restore snapshot from cpio and bzip2 archive
zfs recieve media/mypictures@20070607 | cpio -i | bunzip2 -c ~/backups/20070607.bz2
tar
et cpio
ont tous deux un seul objectif: concaténer de nombreux fichiers distincts dans un seul flux. Ils ne compressent pas les données. (Ces jours-ci, tar
est plus populaire en raison de sa simplicité relative - il peut prendre les fichiers d'entrée en tant qu'arguments au lieu de devoir être associé à find
comme cpio
a.)
Dans votre cas, vous n'avez pas besoin de ces outils; ils n'auraient aucun effet utile, car vous n'auriez pas beaucoup de fichiers séparés. zfs send
a déjà fait la même chose que tar
aurait fait. Donc vous n’avez pas aucun fichier , seulement un flux sans nom.
Pour compresser l'instantané, tout ce que vous avez à faire est d'orienter la sortie zfs
via un programme de compression:
zfs send media/mypictures@20070607 | gzip -c > ~/backups/20070607.gz
gzip -dc ~/backups/20070607.gz | zfs receive media/mypictures@20070607
(Vous pouvez remplacer gzip
par xz
ou bzip2
ou tout autre outil de compression de flux, si vous le souhaitez.)
En plus de ce qui a été dit auparavant par grawity et Paul :
Historique
Dans les "vieux jours", cpio (avec l'option -c
utilisée) était l'outil à utiliser quand il s'agissait de déplacer des fichiers vers d'autres dérivés UNIX car il était plus portable et plus flexible que tar . Mais les problèmes de portabilité tar peuvent être considérés comme résolus depuis la fin des années 1980.
Malheureusement, c’est à peu près à cette époque que différents fournisseurs ont mutilé le format -c
de cpio (il suffit de regarder la page de manuel de GNU cpio et l'option -H
). À ce moment-là , tar est devenu plus portable que cpio ... Il a fallu presque une décennie pour que les différents fournisseurs UNIX aient réglé ce problème. en dehors. Avoir GNU tar et GNU cpio installé était un must pour tous les administrateurs qui devaient traiter avec des bandes de différentes sources (même maintenant je présume).
Interface utilisateur
tar peut utiliser un fichier de configuration de bande dans lequel l'administrateur configurerait les lecteurs de bande connectés au système. L'utilisateur pourrait alors simplement dire "Eh bien, je vais prendre le lecteur de bande 1" au lieu de devoir mémoriser le nœud de périphérique exact de la bande (ce qui peut être très déroutant et n'est pas standardisé sur différentes plates-formes UNIX.
Mais la principale différence est:
tar est capable de rechercher des répertoires par lui-même et prend la liste des fichiers ou des répertoires à sauvegarder à partir d'arguments de ligne de commande.
cpio archive uniquement les fichiers ou les répertoires auxquels il est destiné, mais ne recherche pas les sous-répertoires de manière récursive. Aussi cpio obtient la liste des éléments à archiver de stdin - c’est pourquoi il est presque toujours utilisé en combinaison avec find .
Une commande cpio semble souvent effrayante pour le débutant si elle est comparée à tar :
$ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
$ tar czvf myfiles.tar.gz myfiles
Je pense que c’est la raison principale pour laquelle la plupart des gens utilisent tar pour créer des fichiers d’archive: Pour des tâches simples telles que l’association d’un répertoire complet, il est tout simplement plus facile à utiliser.
Aussi GNU tar offre l'option -z
qui permet de compresser l'archive avec GNU Zip à la volée, ce qui simplifie encore les choses. .
D'autre part, on peut faire des choses intéressantes avec find & cpio . En fait, c’est une approche plus semblable à UNIX: Pourquoi inclure la recherche dans l’arborescence de répertoires dans cpio s’il existe déjà un outil prenant en charge presque tout ce à quoi on peut penser: trouver . Les choses qui me viennent à l’esprit ne font que sauvegarder des fichiers plus récents qu’une certaine date, limiter les fichiers à ceux qui résident dans le même système de fichiers ou filtrer la recherche-sortie avec grep -v
pour exclure certains fichiers ...
Les membres de GNU tar ont consacré beaucoup de travail à inclure un grand nombre de choses auparavant possibles uniquement avec cpio . En fait, les deux outils ont appris l'un de l'autre - mais seul cpio peut lire le format de tar - et non l'inverse.
tar et traitement de la sortie
Une dernière note à quelque chose que vous avez dit:
De plus, on m'a dit que TAR ne pouvait pas compresser depuis STDOUT. Je souhaite archiver/compresser des instantanés ZFS pour les sauvegardes. Je me demandais si je pouvais combiner CPIO avec bzip2 pour obtenir cet effet.
Eh bien, chaque version de tar (GNU ou non) peut être utilisée dans un tuyau. Utilisez simplement un signe moins (-
) comme nom d’archive:
$ tar cvf - myfiles | bzip > myfiles.tar.bz
Aussi GNU tar offre l'option --to-command
pour spécifier une commande de post-processeur - bien que je préfère tout de même le canal. Peut-être est-il utile lors de l'écriture sur certains périphériques matériels.
tar et cpio ont essentiellement la même fonction, qui consiste à créer un seul fichier contigu à partir d'une entrée de plusieurs fichiers et répertoires. À l'origine, c'était pour mettre le résultat sur une bande, mais de nos jours, il est généralement utilisé pour alimenter un utilitaire de compression, comme vous l'avez décrit ci-dessus. En effet, la compression d'un seul fichier volumineux est plus efficace en termes de temps et d'espace que de compresser beaucoup de petits fichiers. Notez que de nombreux formats d'image (png, jpg, etc.) sont déjà fortement compressés et peuvent même devenir un peu plus grands s'ils sont soumis à un utilitaire de compression.
Ni tar ni cpio ne font de compression eux-mêmes. Tar a effectivement "remporté" la guerre "que devons-nous utiliser pour créer des fichiers agrégés", mais cpio est consulté à divers endroits. Je ne suis pas au courant des avantages de l'un sur l'autre, tar gagne en étant plus couramment utilisé.
tar peut en effet prendre les entrées sur stdin et les sorties sur stdout - qui seront ensuite redirigées vers bzip2 comme vous l'avez déjà fait ou quelque chose de similaire. Si appelé avec l'option "z", il invoquera automatiquement gzip sur la sortie.
J'ai demandé à un support technique HP en ca. 1996 pourquoi utiliser cpio
sur tar
.
On m'a dit que les bandes s'étiraient et s'usaient. Lorsque tar
atteint une partie illisible de la bande, elle échoue et renvoie le numéro d'erreur. Lorsque cpio
atteint une partie illisible, il passe au bloc lisible suivant, se resynchronise et continue.
Je n'ai jamais vu de documentation à l'appui, mais j'ai toujours utilisé cpio
.
A noter également: sur (au moins) FreeBSD et Mac OS X, vous pouvez manipuler des fichiers cpio avec tar. BSD tar utilise libarchive sous le capot, il peut donc gérer cpio, pax, shar ...
Cela signifie que les problèmes d'utilisation de la commande cpio
ne doivent pas nécessairement vous empêcher d'interagir avec les fichiers cpio.
Bien que les réponses ici comparent déjà très bien cpio
et tar
, je voudrais mettre en évidence l’une des fonctionnalités de cpio
appelée mode pipeline qui permet de copier plus efficacement des fichiers sélectifs (c.-à-d. Via find
et filtre) tout en préservant la structure de leurs répertoires. Cette fonctionnalité est bien documentée et se présente comme suit:
find . <predicates> | cpio -pdmv /destination/dir
L'équivalent avec tar
impliquerait quelque chose comme ceci:
find . <predicates> | tar -T - -cf - | (cd /destination/dir; tar xvf -)
Il existe bien sûr d’autres alternatives, telles que rsync
et cp --parents
, décrites dans , un autre fil , mais rien n’approche la flexibilité offerte par la combinaison de find
et cpio
. tar
étant omniprésent dans la création d’archives, c’est la seule raison pour laquelle j’utilise toujours cpio
.