web-dev-qa-db-fra.com

tar: ajoute tous les fichiers et répertoires du répertoire courant, y compris le fichier .svn, etc.

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

tar -czf workspace.tar.gz *

La tar résultante inclut les répertoires .svn dans les sous-répertoires, mais PAS dans le répertoire actuel (car * est étendu aux seuls fichiers 'visibles'

J'ai essayé de 

tar -czf workspace.tar.gz . à la place mais j'obtiens une erreur parce que '.' a changé en lisant:

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

Existe-t-il une astuce pour que * corresponde à tous les fichiers (y compris ceux à préfixe point) d'un répertoire?

(utilisation de bash sous Linux SLES-11 (2.6.27.19)

66
Micha

Ne créez pas le fichier tar dans le répertoire que vous préparez:

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

fait le tour, sauf qu'il va extraire les fichiers sur tout le répertoire en cours lorsque vous 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 étiez:

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

(Cela suppose que vous n’ayez pas suivi les liens symboliques pour vous rendre là où vous êtes et que le shell n’essaie pas de vous deviner en sautant en arrière à travers un lien symbolique - bash n’est pas fiable à cet égard. Si vous devez vous en préoccuper , utilisez cd -P .. pour créer un répertoire de modification physique. Stupide que ce ne soit pas le comportement par défaut à mon avis - déroutant, du moins, pour ceux pour qui cd .. n’a jamais eu une autre signification.)


Un commentaire dans la discussion dit:

Je dois [...] exclure le répertoire principal et placer [...] le fichier 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 le fichier de cette archive car, par définition, le répertoire actuel 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éez le fichier ailleurs - /tmp est un emplacement possible - puis remettez-le à l'emplacement d'origine une fois terminé.
  2. Ou: si vous utilisez GNU Tar, utilisez l'option --exclude=workspace.tar.gz. La chaîne après le = est un motif - l'exemple est le motif le plus simple - une correspondance exacte. Vous devrez peut-être spécifier --exclude=./workspace.tar.gz si vous travaillez dans le répertoire actuel contrairement aux recommandations. vous devrez peut-être spécifier --exclude=workspace/workspace.tar.gz si vous travaillez au niveau supérieur, comme suggéré. Si vous devez exclure plusieurs fichiers tar, utilisez '*', comme dans --exclude=./*.gz.
52
Jonathan Leffler

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

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

Il y a quelques étapes à suivre:

  1. Remplacez * par . 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 l'erreur 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 touch), afin que --exclude corresponde au nom de fichier de l'archive. (Cela ne correspond pas le fichier n'existe pas)

Combiné, cela donne le script suivant:

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

dans le répertoire veux compresser (répertoire courant) essayez ceci:

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

Vous pouvez corriger le formulaire . en utilisant --exclude:

tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
6
caf

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

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

En supposant que le répertoire que vous voulez gzip s'appelle workspace.

6
bramp

Mise à jour: J'ai ajouté un correctif pour le commentaire de l'OP.

tar -czf workspace.tar.gz .

va effectivement changer le répertoire actuel, mais pourquoi ne pas placer le fichier ailleurs?

tar -czf somewhereelse/workspace.tar.gz .
mv somewhereelse/workspace.tar.gz . # Update
4
Peter Jaric

En réalité, le problème concerne les options de compression. L'astuce consiste à diriger le compresseur vers un compresseur au lieu d'utiliser les options intégrées. Incidemment, cela peut également vous donner une meilleure compression, puisque vous pouvez définir des options de compression supplémentaires.

Goudron minimal:

tar --exclude=*.tar* -cf workspace.tar .

Pipe à un compresseur de votre choix. Cet exemple est détaillé et utilise xz avec une compression maximale:

tar --exclude=*.tar* -cv . | xz -9v >workspace.tar.xz

La solution a été testée sous Ubuntu 14.04 et Cygwin sous Windows 7 .

4
s3v1

Une bonne question Dans ZSH, vous pouvez utiliser le modificateur globbing (D), qui signifie "dotfiles". Comparer:

ls $HOME/*

et

ls $HOME/*(D)

Cela exclut correctement les entrées de répertoire spéciales . et ... Dans Bash, vous pouvez utiliser .* pour inclure explicitement les fichiers de points:

ls $HOME/* $HOME/.*

Mais cela inclut aussi . et .., donc ce n’est pas ce que vous cherchiez. Je suis sûr qu'il existe un moyen de faire correspondre * à dotfiles dans bash également.

1
loevborg
tar -czf workspace.tar.gz .??* *

La spécification de .??* inclura les fichiers "point" et les répertoires comportant au moins 2 caractères après le point. L'inconvénient est qu'il n'inclura pas les fichiers/répertoires avec un seul caractère après le point, tel que .a, le cas échéant.

0
Scott Thomson

A eu une situation similaire moi-même. Je pense qu'il est préférable de créer le fichier tar ailleurs, puis d'utiliser -C pour indiquer à tar le répertoire de base des fichiers compressés. Exemple:

tar -cjf workspace.tar.gz -C <path_to_workspace> $(ls -A <path_to_workspace>)

De cette façon, il n’est pas nécessaire d’exclure votre propre fichier tarfile. Comme indiqué dans d'autres commentaires, -A listera les fichiers cachés.

0
ginin

Encore une autre solution, en supposant que le nombre d'éléments dans le dossier n'est pas énorme:

tar -czf workspace.tar.gz `ls -A`

(ls -A imprime les fichiers normaux et cachés mais pas "." et ".." comme le fait ls -a.)

0
Joachim Wagner

Le problème avec la plupart des solutions fournies ici est que tar contient ./ au début de chaque entrée. Cela donne donc le répertoire . lors de son ouverture via le compresseur d'interface graphique. Donc ce que j'ai fini par faire est:

ls -1A | xargs -d "\n" tar cfz my.tar.gz

Si vous avez déjà my.tar.gz dans le répertoire courant, vous voudrez peut-être supprimer ceci:

ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz

Soyez conscient de que xargs a une certaine limite (voir xargs --show-limits). Donc, cette solution ne fonctionnerait pas si vous essayez de créer un paquet contenant de nombreuses entrées (répertoires et fichiers) sur un répertoire que vous essayez de tar.

0
Ellis

Si l’espace disque n’est pas un problème, cela peut aussi être une chose très facile à faire: 

mkdir backup
cp -r ./* backup
tar -zcvf backup.tar.gz ./backup
0
bicycle