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)
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:
/tmp
est un emplacement possible - puis remettez-le à l'emplacement d'origine une fois terminé.--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
.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 .
Il y a quelques étapes à suivre:
*
par .
pour inclure également les fichiers cachés.--exclude=workspace.tar.gz
peut être utilisé pour exclure l'archive elle-même.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 .
dans le répertoire veux compresser (répertoire courant) essayez ceci:
tar -czf workspace.tar.gz . --exclude=./*.gz
Vous pouvez corriger le formulaire .
en utilisant --exclude
:
tar -czf workspace.tar.gz --exclude=workspace.tar.gz .
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.
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
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 .
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.
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.
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.
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
.)
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.
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