42 votes

Comment compresser un répertoire avec tar puis supprimer les originaux, y compris le répertoire?

Je suis en train d'essayer de tar une collection de fichiers dans un répertoire appelé 'mon_répertoire' et de supprimer les originaux en utilisant la commande :

tar -cvf fichiers.tar mon_répertoire --remove-files

Cependant, cela ne supprime que les fichiers individuels à l'intérieur du répertoire et pas le répertoire lui-même (ce que j'ai spécifié dans la commande). Que suis-je en train de rater ici ?

MODIFICATION :

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 à ce sujet. (Sur Linux, je tends à ne pas faire vraiment de 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'il ne supprime pas les répertoires.

Cependant, ma principale raison de poser cette question vient de la gestion des chemins absolus par tar. Comme vous devez spécifier un chemin relatif vers un fichier à compresser, vous devez donc vous déplacer vers le répertoire parent pour le tar correctement. À mon avis, l'utilisation de n'importe quel type de commande 'rm' après est potentiellement dangereux dans cette situation. Ainsi, j'espérais simplifier les choses en faisant en sorte que tar le fasse lui-même.

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 était mal saisie, il est possible que le résultat soit la suppression de fichiers de n'importe quel répertoire où vous étiez précédemment.

25voto

pavium Points 6334

Étant donné que l'option --remove-files ne supprime que des fichiers, vous pourriez essayer

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

de sorte que le répertoire ne soit supprimé que si le tar renvoie un statut de sortie de 0

20voto

Mark Points 251

Vous manquez 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 comme,

find /chemin/vers/etre/archivés/ -depth -type d -empty -exec rmdir {} \;


Mise à jour: Vous pourriez être intéressé à lire cette brève discussion Debian sur,
Bug 424692: --remove-files se plaint que les répertoires "ont changé pendant que nous les lisions".

9voto

Jerome Points 45

Avez-vous essayé de mettre la directive --remove-files après le nom de l'archive ? Cela fonctionne pour moi.

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

1voto

Hintswen Points 1200
source={argument de répertoire}

par exemple

source={chemin absolu complet}/mon_répertoire

parent={répertoire parent de l'argument}

par exemple

parent={chemin absolu de 'mon_répertoire'/

logFile={chemin vers un journal d'exécution qui capture les messages d'état}

Ensuite, 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 "Sauvegarde ÉCHEC pour ${source} à `date` >> ${logFile}

else

 echo "Sauvegarde RÉUSSIE pour ${source} à `date` >> ${logFile}

 rm -rf ${source}

fi

1voto

mit Points 1467

C'était probablement un bug.

Aussi, le mot "fichier" est ambigu dans ce cas. Mais parce que c'est une commande en ligne, je m'attendrais à ce qu'il signifie aussi des répertoires, car dans Unix/Linux tout est un fichier, y compris un répertoire. (L'autre interprétation est bien sûr aussi valide, mais il n'a aucun sens de conserver les répertoires dans un tel cas. Je considérerais cela comme un comportement inattendu et confus.)

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 le fait de conserver l'arborescence était un bug. Ou du moins une sorte de solution de contournement jusqu'à ce qu'ils le corrigent.

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

# COMME VOUS POUVEZ LE VOIR, L'ARBRE A DISPARU MAINTENANT :

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/fichier1                                                                                        
tar -czf tree1.tar.gz tree1/ --remove-files
ls -la

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X