La commande Tar sous Linux: Tar CVF et Tar XVF expliqués avec des exemples de commandes

Le nom tarest, selon la plupart des comptes, une abréviation d' archive sur bande . Les «bandes» en question seraient tous ces lecteurs de stockage magnétiques qui étaient populaires dans les années 1950.

Cela suggère que l' taroutil est peut-être un peu vieux et a dépassé son apogée. Mais la vérité est que, au fil des années et à travers tous les changements sismiques dans le monde informatique, tarn'a rien perdu de sa puissance et de sa valeur.

Dans cet article, basé sur le contenu de mon livre Linux in Action, je vais vous montrer les bases de la création, de la compression et de la restauration d'archives tar. Commençons par le début.

Créer des archives

Cet exemple prendra tous les fichiers et répertoires dans et en dessous du répertoire de travail actuel et construira un fichier d'archive que j'ai habilement nommé archivename.tar.

Ici, j'utilise trois arguments après la commande tar:

  • le cdit à tar de créer une nouvelle archive,
  • v définit la sortie de l'écran sur verbeuse pour que je reçoive des mises à jour, et
  • f pointe vers le nom de fichier que je souhaite donner à l'archive.

C'est *ce qui dit tard'inclure tous les fichiers et répertoires locaux de manière récursive.

$ tar cvf archivename.tar * file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

La commande tar ne déplacera ni ne supprimera jamais les répertoires et fichiers d'origine que vous alimentez - elle ne fait que des copies archivées.

Vous devez également noter que l'utilisation d'un point (.) Au lieu d'un astérisque (*) dans la commande précédente inclurait même les fichiers cachés (dont les noms de fichiers commencent par un point) dans l'archive.

Si vous suivez sur votre propre ordinateur (comme vous devriez certainement le faire), vous verrez un nouveau fichier nommé archivename.tar. L'extension de nom de fichier .tar n'est pas nécessaire, mais c'est toujours une bonne idée de communiquer clairement l'objectif d'un fichier de autant de manières que possible.

Extraire votre archive pour restaurer les fichiers est simple: utilisez simplement à la xvfplace de cvf. Cela, dans l'exemple, enregistrera de nouvelles copies des fichiers et répertoires d'origine à l'emplacement actuel.

$ tar xvf archivename.tar file1 file2 file3 directory1 directory1/morestuff directory1/morestuff/file100 directory1/morestuff/file101 

Bien sûr, vous pouvez également demander à tar d'envoyer vos fichiers extraits à un autre endroit en utilisant l' -Cargument, suivi de l'emplacement cible:

$ tar xvf archivename.tar -C /home/mydata/oldfiles/ 

Vous ne voudrez pas toujours inclure tous les fichiers dans une arborescence de répertoires dans votre archive.

Supposons que vous ayez produit des vidéos, mais qu'elles sont actuellement conservées dans des répertoires avec toutes sortes de fichiers graphiques, audio et texte (contenant vos notes). Les seuls fichiers que vous devez sauvegarder sont les clips vidéo finaux utilisant l'extension de nom de fichier .mp4.

Voici comment procéder:

$ tar cvf archivename.tar *.mp4 

C'est génial. Mais ces fichiers vidéo sont énormes. Ne serait-il pas bien de rendre cette archive un peu plus petite en utilisant la compression?

Ne dis pas plus! Exécutez simplement la commande précédente avec l' zargument (zip). Cela indiquera au programme gzip de compresser l'archive.

Si vous souhaitez suivre la convention, vous pouvez également ajouter une .gzextension en plus de celle .tarqui existe déjà. N'oubliez pas: la clarté.

Voici comment cela se passerait:

$ tar czvf archivename.tar.gz *.mp4 

Si vous essayez cela sur vos propres fichiers .mp4, puis exécutez ls -l sur le répertoire contenant les nouvelles archives, vous remarquerez peut-être que le .tar.gzfichier n'est pas tellement plus petit que le .tarfichier, peut-être 10% environ. Qu'est-ce que c'est que ça?

Eh bien, le .mp4format de fichier est lui-même compressé, il y a donc beaucoup moins de place pour gzip pour faire son travail.

Comme tar est pleinement conscient de son environnement Linux, vous pouvez l'utiliser pour sélectionner des fichiers et des répertoires qui résident en dehors de votre répertoire de travail actuel. Cet exemple ajoute tous les .mp4fichiers du /home/myuser/Videos/répertoire:

$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4 

Étant donné que les fichiers d'archive peuvent devenir volumineux, il peut parfois être judicieux de les décomposer en plusieurs fichiers plus petits, de les transférer vers leur nouveau domicile, puis de recréer le fichier d'origine à l'autre extrémité. L'outil fractionné est conçu à cet effet.

Dans cet exemple, -bindique à Linux de diviser le fichier archivename.tar.gz en parties de 1 Go. L'opération nomme ensuite chacune des pièces: nom_archive.tar.gz.partaa, nom_archive.tar.gz.partab, nom_archive.tar.gz.partac, etc.

$ split -b 1G archivename.tar.gz "archivename.tar.gz.part" 

De l'autre côté, vous recréez l'archive en lisant chacune des parties dans l'ordre (cat archivename.tar.gz.part *), puis redirigez la sortie vers un nouveau fichier appelé archivename.tar.gz:

$ cat archivename.tar.gz.part* > archivename.tar.gz 

Archives du système de fichiers en streaming

Voici où commencent les bonnes choses. Je vais vous montrer comment créer une image d'archive d'une installation Linux en cours de fonctionnement et la diffuser vers un emplacement de stockage distant - le tout dans une seule commande. Voici la commande:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

Plutôt que d'essayer d'expliquer tout cela tout de suite, j'utiliserai des exemples plus petits pour l'explorer un morceau à la fois.

Créons une archive du contenu d'un répertoire appelé importantstuff qui est rempli de choses vraiment importantes:

$ tar czvf - importantstuff/ | ssh [email protected] "cat > /home/username/myfiles.tar.gz" importantstuff/filename1 importantstuff/filename2 [...] [email protected]'s password: 

Laissez-moi vous expliquer cet exemple. Plutôt que d'entrer le nom de l'archive juste après les arguments de la commande (comme vous l'avez fait jusqu'à présent), j'ai utilisé un tiret (czvf -).

Le tableau de bord sort les données sur la sortie standard. Il vous permet de repousser les détails du nom du fichier d'archive à la fin de la commande et indique à tar d'attendre le contenu source de l'archive à la place.

J'ai ensuite redirigé (|) l'archive compressée sans nom vers un login ssh sur un serveur distant où on m'a demandé mon mot de passe.

La commande entre guillemets a ensuite exécuté cat sur le flux de données d'archive, qui a écrit le contenu du flux dans un fichier appelé myfiles.tar.gz dans mon répertoire personnel sur l'hôte distant.

Un avantage de générer des archives de cette manière est que vous évitez la surcharge d'une étape intermédiaire. Il n'est même pas nécessaire de sauvegarder temporairement une copie de l'archive sur la machine locale. Imaginez la sauvegarde d'une installation qui occupe 110 Go de ses 128 Go d'espace disponible. Où iraient les archives?

C'était juste un répertoire de fichiers. Supposons que vous ayez besoin de sauvegarder un système d'exploitation Linux actif sur un lecteur USB afin de pouvoir le déplacer sur une machine distincte et le déposer dans le lecteur principal de cette machine.

En supposant qu'il y ait déjà une nouvelle installation de la même version de Linux sur la deuxième machine, la prochaine opération de copier / coller générera une réplique exacte de la première.

REMARQUE: cela ne fonctionnera pas sur un lecteur cible sur lequel aucun système de fichiers Linux n'est déjà installé. Pour gérer cette situation, vous devrez utiliser dd.

The next example creates a compressed archive on the USB drive known as /dev/sdc1.

The --one-file-system argument excludes all data from any file system besides the current one. This means that pseudo partitions like /sys/ and /dev/ won’t be added to the archive. If there are other partitions that you want to include (as you’ll do for /usr/ and /var/ in this example), then they should be explicitly added.

Finally, you can exclude data from the current file system using the --exclude argument:

# tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \ --one-file-system \ / /usr /var \ --exclude=/home/andy/ 

Now let’s go back to that full-service command example. Using what you’ve already learned, archive all the important directories of a file system and copy the archive file to a USB drive. It should make sense to you now:

# tar czvf - --one-file-system / /usr /var \ --exclude=/home/andy/ | ssh [email protected] \ "cat > /home/username/workstation-backup-Apr-10.tar.gz" 

There's much more administration goodness in the form of books, courses, and articles available at my bootstrap-it.com.