web-dev-qa-db-fra.com

Comment tar répertoire puis supprimer les originaux y compris le répertoire?

J'essaie de tar une collection de fichiers dans un répertoire appelé 'mon_répertoire' et supprime les originaux à l'aide de la commande suivante:

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

Cependant, cela ne fait que supprimer les fichiers individuels à l'intérieur du répertoire et non le répertoire lui-même (c'est ce que j'ai spécifié dans la commande). Qu'est-ce que j'oublie ici?

EDIT:

Oui, je suppose que l'option 'remove-files' est assez littérale. Bien que moi aussi, j’ai trouvé la page de manuel peu claire sur ce point. (Sous Linux, j’ai tendance à ne pas vraiment distinguer beaucoup 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 est qu'il ne supprime pas les répertoires.

Cependant, le principal point qui m'a incité à poser cette question découle de la gestion par tar des chemins absolus. Étant donné que vous devez spécifier un chemin relatif vers un fichier/s à compresser, vous devez donc passer au répertoire parent pour le tarer correctement. Comme je le vois, utiliser n'importe quel type de commande 'rm' est potentiellement dangereux dans cette situation. J'espérais donc simplifier les choses en faisant en sorte que le goudron se charge lui-même de la suppression.

Par exemple, imaginez un script de sauvegarde dans lequel le répertoire à sauvegarder (par exemple, 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 de n'importe quel répertoire dans lequel vous vous êtes trouvé.

28
Nicholas

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

Vous pouvez suivre l’opération d’archivage et de suppression de fichier avec une commande du type:

trouver/chemin/à/être/archivé/-depth-type d -empty -exec rmdir {} \;


Mise à jour: Vous pouvez être intéressé par la lecture de cette courte discussion Debian sur,
Bogue 424692: --remove-files se plaint du fait que les répertoires "ont été modifiés au fur et à mesure de la lecture" .

10
nik

Puisque l'option --remove-files uniquement supprime les fichiers , vous pouvez essayer

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

afin que le répertoire ne soit supprimé que si tar renvoie un état de sortie égal à 0

17
pavium

Avez-vous essayé de mettre la directive --remove-files après le nom de l’archive? Ça marche pour moi.

tar -cvf files.tar --remove-files my_directory
5
Robert Grubba

C'était probablement un bug.

De plus, le mot "fichier" est ambigu dans ce cas. Mais comme il s’agit d’un commutateur de ligne de commande, j’entends bien s’entendre également dans les répertoires, car dans unix/lnux, tout est un fichier, également 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 cela comme un comportement inattendu et déroutant.)

Mais j’ai constaté que dans certaines distributions, gnu tar supprimait effectivement l’arborescence de répertoires. Une autre indication que garder l'arbre était un bug. Ou au moins une solution de contournement jusqu'à ce qu'ils résolvent le problème.

Voici ce que j'ai essayé sur une console Ubuntu 10.04:

 mit:/var/tmp $ mkdir tree1 
 mit:/var/tmp $ mkdir arbre1/sub1 
 mit:/var/tmp $> arbre1/sub1/fichier1 
 
 avec:/var/tmp $ ls -la 
 drwxrwxrwt 4 racine racine 4096 2011-11-14 15:40. 
 drwxr-xr-x 16 racine 4096 2011-02-25 03:15 .. 
 drwxr-xr-x 3 avec mit 4096 2011-11-14 15:40 tree1 
 
 mit:/var/tmp $ tar -czf tree1.tar.gz tree1/--remove-files 
 
 # COMME VOUS POUVEZ VOIR L’ARBRE IS GONE NOW: 
 
 Mit:/var/tmp $ ls -la 
 Drwxrwxrwt 3 racine racine 4096 2011-11-14 15:41. 
 drwxr-xr-x 16 racine 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 
 Droits d'auteur © 2009 Free Software Foundation, Inc . 
 

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

 tar --version 
 cd /var/tmp
mkdir -p tree1/sub1 
> arbre1/sub1/fichier1 
 tar -czf arbre1 .tar.gz tree1/--remove-files 
 ls -la 
1
mit
source={directory argument}

par exemple.

source={FULL ABSOLUTE PATH}/my_directory

parent={parent directory of argument}

par exemple.

parent={ABSOLUTE PATH of 'my_directory'/

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

Ensuite, vous pouvez exécuter quelque chose comme:

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
shellking