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

30

Je suis en train de tarune collection de fichiers dans un répertoire appelé « my_directory » et retirer les originaux en utilisant la commande:

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

Cependant, il supprime uniquement 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 j'oublie ici?

MODIFIER:

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 faire 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 est qu'il ne supprime pas les répertoires.

Cependant, mon principal point de départ pour poser cette question découle de la gestion par tar des chemins absolus. Étant donné que vous devez spécifier un chemin d'accès relatif à un ou plusieurs fichiers à compresser, vous devez par conséquent modifier le répertoire parent pour le tarer correctement. Comme je le vois, utiliser n'importe quel type de commande «rm» de suivi est potentiellement dangereux dans cette situation. J'espérais donc simplifier les choses en faisant tar lui-même faire le retrait.

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

Nicolas
la source
Nicholas, votre argument selon lequel cela ajoute le danger d'avoir à supprimer l'arborescence de répertoires dans une étape supplémentaire est absolument valable. Je pense qu'il devrait être possible de le faire en toute sécurité par l'archiveur. Je crois aussi que c'était l'intention des créateurs de GNU tar, au moins cela aurait dû être ;-)
mit
2
J'ai trouvé que l'option --remove-files supprime en effet le répertoire contenant - au moins sur certaines plates-formes / dans certaines versions - et dans mon cas. Peut-être que dans votre cas, le répertoire restant n'était pas complètement vide en raison de la modification de certains fichiers après avoir été tarés.
isync
@isync Il semblerait que --remove-files supprime des répertoires sur Ubuntu 14.04. Sauf dans mon cas, je ne le veux pas. Haha
Bradley Odell

Réponses:

12

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

Vous pouvez suivre l'opération d'archivage et de suppression de fichiers avec une commande comme,

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


Mise à jour: Vous pouvez être intéressé par la lecture de cette courte discussion Debian sur le
bogue 424692: --remove-files se plaint que les répertoires "ont changé au fur et à mesure que nous le lisons" .

nik
la source
Peut-être que c'est en fait: -cchange de répertoire avant de tarcommencer son travail (et ne revient en quelque sorte qu'une fois terminé)? Je suppose que cela aurait supprimé des sous-répertoires, si ceux-ci étaient inclus dans l'archive (mais je n'ai pas testé cela).
Arjan
@Arajan, je ne pense pas que cela c'ait quelque chose à voir avec cela; 'remove-files'ne supprime pas intentionnellement les répertoires.
nik
Aha, je trouve la courte explication "supprimer les fichiers après les avoir ajoutés à l'archive" des manpages pas trop claire à ce sujet, mais je suppose que vous avez raison. Pourtant, je ne m'attendrais pas à ce que le répertoire mentionné -csoit supprimé même s'il tar supprimait également les répertoires. (Pour moi, ce serait comme supprimer le répertoire courant, donc inclure l'archive elle-même, quand on n'utilise pas-c ...?) Mais si -remove-filestoujours laisse les répertoires en place, je ne fais que compliquer les choses ici. ;-)
Arjan
3
--remove-filesle bug a été corrigé tar-1.19.
x-yuri
19

Étant donné que l' --remove-filesoption supprime uniquement les fichiers , vous pouvez essayer

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

de sorte que le répertoire est supprimé uniquement si le tarrenvoie un état de sortie de 0

pavium
la source
9
sauf que vous devez vérifier l'état de sortie de tar avant de faire le rm! sinon vous risquez de ne pas avoir d'archive tar ni de fichier ...
Kim
1
Lorsque j'utilise des répertoires à un niveau, je pense qu'une option plus sûre serait d'utiliser 'rmdir' plutôt que 'rm' car cela ne supprimerait qu'un répertoire vide. [Voir les modifications de questions]
Nicholas
Mais rmdirne supprime que les répertoires vides . L'idée était de supprimer le répertoire et les fichiers qu'il tar
contient
--remove-filesle bug a été corrigé tar-1.19.
x-yuri
&& n'exécutera la commande suivante que si la commande précédente a quitté 0 (succès). S'il sort> 0, la commande suivante ne sera pas exécutée. Vous pouvez également inverser cela avec || - ne s'exécute que si la première commande a échoué. Bon moyen de faire un contrôle de contenu terrible redémarre celui-ci.
Kirrus
6

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
Robert Grubba
la source
1
Il est plus probable que le comportement du goudron ait changé depuis que cette question a été posée. Pour moi, il n'y a pas de différence à mettre --remove-filesavant ou après my_directory; dans les deux cas, le répertoire est supprimé.
redburn
5
--remove-filesle bug a été corrigé tar-1.19.
x-yuri
1
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
décortiquer
la source
1

C'était probablement un bug.

Le mot "fichier" est également ambigu dans ce cas. Mais comme il s'agit d'un commutateur de ligne de commande, je m'attendrais à ce qu'il désigne également 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 les répertoires dans un tel cas. Je considérerais cela comme un comportement inattendu et déroutant.)

Mais j'ai trouvé que dans gnu tar sur certaines distributions, gnu tar supprime en fait l'arborescence des répertoires. Une autre indication que garder l'arbre était un bug. Ou au moins une solution de contournement jusqu'à ce qu'ils le corrigent.

Voici 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 VOIR L'ARBRE EST PARTI 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-le dans une console à vos risques et périls:

tar --version                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> arbre1 / sub1 / fichier1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
mit
la source