2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32

Comment tarer le répertoire et ensuite supprimer les originaux, y compris le répertoire ?

J'essaie de mettre à tar une collection de fichiers dans un répertoire appelé “mon_répertoire” et de supprimer les originaux en utilisant la commande :

tar -cvf files.tar my_directory --remove-files

Toutefois, il ne s'agit que de supprimer les fichiers individuels à l'intérieur du répertoire et non le répertoire lui-même (ce que j'ai spécifié dans la commande). Qu'est-ce que je manque ici ?

EDIT:

Oui, je suppose que l'option “remove-files” est assez littérale. Bien que je trouve moi aussi que la page de manuel n'est pas claire sur ce point. (Sous linux, j'ai tendance à ne pas vraiment faire la distinction entre les répertoires et les fichiers, et j'oublie parfois qu'ils ne sont pas la même chose). Il semble que le consensus soit qu'elle ne supprime pas les répertoires.

Cependant, mon principal argument pour poser cette question provient de la gestion des chemins absolus par tar. Comme vous devez spécifier un chemin relatif vers un ou plusieurs fichiers à compresser, vous devez donc passer au répertoire parent pour le tarer correctement. À mon avis, l'utilisation de toute commande “rm” subséquente est potentiellement dangereuse dans cette situation. J'espérais donc simplifier les choses en faisant en sorte que le tar lui-même fasse la suppression.

Par exemple, imaginez un script de sauvegarde où le répertoire à sauvegarder (c'est-à-dire tar) est inclus en tant que variable shell. Si la valeur de cette variable shell a été mal saisie, il est possible que le résultat soit des fichiers supprimés du dernier répertoire dans lequel vous vous trouviez.

Réponses (5)

19
19
19
2010-01-17 11:58:18 +0000

Puisque l'option --remove-files ne supprime les fichiers, vous pourriez essayer

tar -cvf files.tar my_directory && rm -R my_directory

afin que le répertoire ne soit supprimé que si l'option tar renvoie un statut de sortie de 0

12
12
12
2010-01-17 11:42:11 +0000

Il vous manque la partie qui dit que l'option --remove-files supprime les fichiers après les avoir ajoutés à l'archive.

Vous pourriez suivre l'opération d'archivage et de suppression de fichiers avec une commande du type,

find /path/to/be/archived/ -depth -type d -empty -exec rmdir {} \ ;


Mise à jour : Vous serez peut-être intéressé de lire cette courte discussion Debian sur, Bug 424692 : –remove-files se plaint que les répertoires “ont changé au fur et à mesure que nous le lisons” .

7
7
7
2014-11-12 10:15:09 +0000

Avez-vous essayé de faire suivre le nom des archives de la directive “Supprimer les fichiers” ? Cela fonctionne pour moi.

tar -cvf files.tar --remove-files my_directory
1
1
1
2010-10-04 19:58:41 +0000
source={directory argument}

par exemple

source={FULL ABSOLUTE PATH}/my_directory

&nbsp ;

parent={parent directory of argument}

par exemple

parent={ABSOLUTE PATH of 'my_directory'/

&nbsp ;

logFile={path to a run log that captures status messages}

Alors vous pourriez exécuter quelque chose du genre

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [$? != 0]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi
1
1
1
2011-11-14 13:21:38 +0000

C'était probablement un bug.

Le mot “fichier” est également ambigu dans ce cas. Mais comme il s'agit d'un commutateur en ligne de commande, je m'attendrais à ce qu'il désigne également les répertoires, car sous unix/lnux, tout est un fichier, et aussi un répertoire. (L'autre interprétation est bien sûr également valable, mais cela n'a aucun sens de conserver des répertoires dans un tel cas. Je considérerais qu'il s'agit d'un comportement inattendu et déroutant).

Mais j'ai découvert que dans gnu tar sur certaines distributions, gnu tar supprime en fait l'arborescence des répertoires. Une autre indication que la conservation de l'arborescence était un bogue. Ou du moins une solution de contournement jusqu'à ce qu'il soit corrigé.

C'est ce que j'ai essayé sur une console ubuntu 10.04 :

mit:/var/tmp$ mkdir tree1 mit:/var/tmp$ mkdir tree1/sub1 mit:/var/tmp$ \> tree1/sub1/file1 mit:/var/tmp$ ls -la drwxrwxrwt 4 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1 mit:/var/tmp$ tar -czf tree1.tar.gz tree1/ --remove-files # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. -rw-r--r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz mit:/var/tmp$ tar --version tar (GNU tar) 1.22 Copyright © 2009 Free Software Foundation, Inc.

Si vous voulez le voir sur votre machine, collez ceci dans une console à vos risques et périls :

tar --version cd /var/tmp mkdir -p tree1/sub1 \> tree1/sub1/file1 tar -czf tree1.tar.gz tree1/ --remove-files ls -la