J'essaye de tar.gz un répertoire et utilise
tar -czf workspace.tar.gz *
Le tar résultant inclut les .svn
répertoires dans les sous-répertoires mais PAS dans le répertoire courant (car il *
est étendu uniquement aux fichiers `` visibles '' avant d'être transmis à tar
j'ai essayé de
tar -czf workspace.tar.gz .
à la place, mais j'obtiens une erreur parce que '.' a changé lors de la lecture:
tar: ./workspace.tar.gz: file changed as we read it
Existe-t-il une astuce pour faire *
correspondre tous les fichiers (y compris le préfixe point) dans un répertoire?
(en utilisant bash sur Linux SLES-11 (2.6.27.19)
linux
bash
design-patterns
tar
Micha
la source
la source
Réponses:
Ne créez pas le fichier tar dans le répertoire que vous empaquetez:
fait l'affaire, sauf qu'il extraira les fichiers dans tout le répertoire actuel 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'avez 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 digne de confiance à cet égard. Si vous devez vous inquiéter à ce sujet, utilisercd -P ..
pour faire un répertoire de changement physique. Stupide que ce ne soit pas le comportement par défaut à mon avis - déroutant, au moins, pour ceux pour quicd ..
n'ont jamais eu de signification alternative.)Un commentaire dans la discussion dit:
La première partie du commentaire n'a pas beaucoup de sens - si le fichier tar contient le répertoire actuel, 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 replacez-le à l'emplacement d'origine une fois qu'il est terminé.--exclude=workspace.tar.gz
option. La chaîne après le=
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 augmentez d'un niveau comme suggéré. Si vous avez plusieurs fichiers tar à exclure, utilisez '*
', comme dans--exclude=./*.gz
.la source
Si vous ne voulez vraiment pas inclure le répertoire top dans l'archive tar (et c'est généralement une mauvaise idée):
la source
Acdrtux
, soit l'un des longs noms de fonction. Une lettre de fonction n'a pas besoin d'être précédée de-
, et peut être combinée avec d'autres options à une seule lettre.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
erreur lorsque l'archive n'est pas encore créée, assurez-vous qu'elle existe (par exemple en utilisanttouch
), afin que --exclude corresponde au nom du fichier d'archive. (Il ne correspond pas au fichier n'existe pas)Combiné, cela donne le script suivant:
la source
--verbose
, comme suit:-czvf
.dans le répertoire que vous voulez compresser (répertoire actuel) essayez ceci:
la source
.gz
fichiers du répertoire.Vous pouvez inclure les répertoires cachés en retournant dans un répertoire et en faisant:
cd .. tar czf workspace.tar.gz workspace
En supposant que le répertoire que vous vouliez gzip s'appelait workspace.
la source
tar -czf /path/to/where/you/do/have/permission/workspace.tar.gz workspace
-
avant leczf
pour que ça marche. Sinon, je recevaisCannot stat: No such file or directory
un message d'erreur.Vous pouvez corriger le
.
formulaire en utilisant--exclude
:la source
Mise à jour: j'ai ajouté un correctif pour le commentaire de l'OP.
va en effet changer le répertoire courant, mais pourquoi ne pas placer le fichier ailleurs?
tar -czf somewhereelse/workspace.tar.gz . mv somewhereelse/workspace.tar.gz . # Update
la source
En fait, le problème vient des options de compression. L'astuce est de diriger le résultat du tar vers un compresseur au lieu d'utiliser les options intégrées. Incidemment, cela peut également vous donner une meilleure compression, car vous pouvez définir des options de compression supplémentaires.
Goudron minimal:
Conduisez vers un compresseur de votre choix. Cet exemple est détaillé et utilise xz avec une compression maximale:
La solution a été testée sur Ubuntu 14.04 et Cygwin sur Windows 7. C'est une réponse wiki de la communauté, alors n'hésitez pas à modifier si vous repérez une erreur.
la source
Le problème avec la plupart des solutions proposées ici est que tar contient
./
au début de chaque entrée. Donc, cela se traduit par un.
répertoire lors de son ouverture via le compresseur GUI. Donc ce que j'ai fini par faire, c'est:ls -1A | xargs -d "\n" tar cfz my.tar.gz
Si vous en avez déjà
my.tar.gz
dans le répertoire courant, vous voudrez peut-être grep ceci:ls -1A | grep -v my.tar.gz | xargs -d "\n" tar cfz my.tar.gz
Sachez que xargs a une certaine limite (voir
xargs --show-limits
). Donc, cette solution ne fonctionnerait pas si vous essayez de créer un package contenant de nombreuses entrées (répertoires et fichiers) sur un répertoire que vous essayez de tarer.la source
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 dotfiles:ls $HOME/* $HOME/.*
Mais cela inclut
.
et..
aussi, donc ce n'est pas ce que vous recherchiez. Je suis sûr qu'il existe également un moyen de faire*
correspondre les fichiers dotfiles dans bash.la source
.??*
pour faire correspondre tous les fichiers de points non.
et..
. Cela n'obtient pas de fichiers de points à un seul caractère (comme.a
). Pour les obtenir aussi, utilisez le plus compliqué.[^.]*
.Encore une autre solution, en supposant que le nombre d'éléments dans le dossier n'est pas énorme:
(
ls -A
imprime les fichiers normaux et cachés mais pas "." et ".." comme lels -a
font.)la source
La spécification
.??*
inclura les fichiers et les répertoires «point» qui ont 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, par exemple.a
, s'il y en a.la source
Si l'espace disque n'est pas un problème, cela pourrait également être une chose très facile à faire:
la source
J'ai eu une situation similaire moi-même. Je pense qu'il est préférable de créer le tar ailleurs, puis d'utiliser -C pour indiquer à tar le répertoire de base des fichiers compressés. Exemple:
De cette façon, il n'est pas nécessaire d'exclure votre propre tarfile. Comme indiqué dans d'autres commentaires, -A listera les fichiers cachés.
la source
10 ans plus tard, vous avez une alternative à
tar
, illustrée avec Git 2.30 (Q1 2021), qui utilise "git archive
" ( man ) pour produire l'archive tar de la version au lieu de tar.(Vous n'avez pas besoin de Git 2.30 pour appliquer cette alternative)
Voir commit 4813277 (11 octobre 2020) et commit 93e7031 (10 octobre 2020) par René Scharfe (
rscharfe
) .(Fusionné par Junio C Hamano -
gitster
- dans commit 63e5273 , 27 oct 2020)Donc au lieu de:
Vous ne pouvez utiliser que Git:
Cela a été initialement proposé car, comme expliqué ici , une plate-forme exotique pourrait avoir une ancienne distribution tar avec des options manquantes.
la source
L'utilisation
find
est probablement le moyen le plus simple:find . -maxdepth 1 -exec tar zcvf workspace.tar.gz {} \+
find . -maxdepth 1
trouvera tous les fichiers / répertoires / liens symboliques / etc dans le répertoire courant et exécutera la commande spécifiée par-exec
. Le{}
dans la commande signifie que la liste des fichiers va ici et\+
signifie que la commande sera exécutée comme:au lieu de
la source