127 votes

tar : ajoute tous les fichiers et répertoires dans le répertoire courant INCLUANT .svn et ainsi de suite

J'essaie de tar.gz un répertoire et d'utiliser

tar -czf workspace.tar.gz *

Le goudron obtenu comprend .svn dans les sous-répertoires, mais PAS dans le répertoire courant (comme dans le cas de * est étendu aux seuls fichiers "visibles" avant d'être transmis à tar

J'ai essayé de

tar -czf workspace.tar.gz . mais je reçois une erreur parce que '.' a changé pendant la lecture :

tar: ./workspace.tar.gz: file changed as we read it

Existe-t-il une astuce pour que * correspond à tous les fichiers (y compris ceux préfixés par des points) d'un répertoire ?

(en utilisant bash sur Linux SLES-11 (2.6.27.19))

109voto

Jonathan Leffler Points 299946

Ne créez pas le fichier tar dans le répertoire que vous êtes en train d'emballer :

tar -czf /tmp/workspace.tar.gz .

fait l'affaire, sauf qu'il va extraire les fichiers dans tout le répertoire courant lorsque vous les décompressez. Mieux vaut faire :

cd ..
tar -czf workspace.tar.gz workspace

ou, si vous ne connaissez pas le nom du répertoire dans lequel vous vous trouviez :

base=$(basename $PWD)
cd ..
tar -czf $base.tar.gz $base

(Cela suppose que vous n'avez pas suivi de liens symboliques pour arriver là où vous êtes et que l'interpréteur de commandes n'essaie pas de vous deviner en revenant en arrière à travers un lien symbolique). bash n'est pas digne de confiance à cet égard. Si vous devez vous en préoccuper, utilisez cd -P .. pour effectuer un changement physique de répertoire. Il est stupide que ce ne soit pas le comportement par défaut à mon avis - déroutant, au moins, pour ceux pour qui les cd .. n'a jamais eu d'autre sens).


Un commentaire dans la discussion dit :

Je [...] dois exclure le répertoire supérieur et je [...] dois placer le tar dans le répertoire de base.

La première partie du commentaire n'a pas beaucoup de sens - si le fichier tar contient le répertoire courant, il ne sera pas créé lorsque vous extrayez un fichier de cette archive car, par définition, le répertoire courant existe déjà (sauf dans des circonstances très étranges).

La deuxième partie du commentaire peut être traitée de deux manières :

  1. Soit : créer le fichier ailleurs - /tmp est l'un des emplacements possibles - et de le replacer à son emplacement d'origine une fois qu'il est terminé.
  2. Ou : si vous utilisez GNU Tar, utilisez l'option --exclude=workspace.tar.gz option. La chaîne de caractères qui suit l'option = est un modèle - l'exemple est le modèle le plus simple - une correspondance exacte. Vous devrez peut-être spécifier --exclude=./workspace.tar.gz si vous travaillez dans le répertoire courant, contrairement aux recommandations ; vous devrez peut-être spécifier --exclude=workspace/workspace.tar.gz si vous montez d'un niveau comme cela est suggéré. Si vous avez plusieurs fichiers tar à exclure, utilisez ' * ', comme dans --exclude=./*.gz .

82voto

Veger Points 17657

Il y a plusieurs étapes à franchir :

  1. Remplacer * por . pour inclure également les fichiers cachés.
  2. Pour créer l'archive dans le même répertoire, un --exclude=workspace.tar.gz peut être utilisé pour exclure l'archive elle-même.
  3. Pour éviter que le tar: .: file changed as we read it lorsque l'archive n'est pas encore créée, assurez-vous qu'elle existe (par exemple en utilisant la fonction touch ), de sorte que le --exclure correspond au nom de fichier de l'archive. (Il n'y a pas de correspondance si le fichier n'existe pas).

La combinaison de ces éléments donne le script suivant :

touch workspace.tar.gz
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .

47voto

rkhayrov Points 5829

Si vous vraiment ne veulent pas inclure le répertoire top dans l'archive (et c'est généralement une mauvaise idée) :

tar czf workspace.tar.gz -C /path/to/workspace .

19voto

empugandring Points 23

Dans le répertoire à compresser (répertoire actuel), essayez ceci :

tar -czf workspace.tar.gz . --exclude=./*.gz

14voto

bramp Points 3769

Vous pouvez inclure les répertoires cachés en remontant d'un répertoire et en faisant :

cd ..
tar czf workspace.tar.gz workspace

En supposant que le répertoire que vous vouliez compresser s'appelle workspace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X