426 votes

Comment tarifier un répertoire de fichiers et de dossiers sans inclure le répertoire lui-même ?

C'est généralement le cas :

tar -czvf my_directory.tar.gz my_directory

Que faire si je veux simplement inclure tout ce qui se trouve dans mon_répertoire (y compris les fichiers système cachés), mais pas le répertoire lui-même ? Je ne veux pas :

my_directory
   --- my_file
   --- my_file
   --- my_file

Je veux :

my_file
my_file
my_file

0 votes

Est-ce que c'est le comportement par défaut de l'action tar -czf ? Dans mon cas, il ne stocke que les fichiers et non le répertoire. Quand je me contente de tar le répertoire, il l'inclut mais avec tar -czf il ne fait qu'ajouter les fichiers.

724voto

dubek Points 2815

Utiliser le -C de l'interrupteur de goudron :

tar -czvf my_directory.tar.gz -C my_directory .

En -C my_directory indique à tar de changer le répertoire courant en my_directory et ensuite . signifie "ajouter tout le répertoire actuel" (y compris les fichiers cachés et les sous-répertoires).

Veillez à le faire -C my_directory avant de le faire . sinon vous obtiendrez les fichiers du répertoire actuel.

Avertissement Vous obtiendrez des entrées telles que ./file-name.ext au lieu de file-name.ext !

Si vous avez besoin d'entrées sous forme de file-name.ext lire d'autres réponses.

5 votes

+1 merci ! C'est ce foutu '.' qui me manquait, c'est tellement énervant.

16 votes

"Contrairement à la plupart des options, -C est traité à l'endroit où il apparaît dans la liste des fichiers à traiter. Considérons la commande suivante : tar --create --file=foo.tar -C /etc passwd hosts -C /lib libc.a " apl.jhu.edu/Misc/Unix-info/tar/tar_65.html J'essaie toujours tar -czvf my_directory.tar.gz * -C my_directory et cela ne fonctionne pas. -C l'emplacement est important ! Fichu goudron...

67 votes

Pas parfait - le fichier tar contient '.' et aussi ./file1 au lieu de file1. J'aime la solution de mateusza ci-dessous d'utiliser --strip-components lors du détartrage.

255voto

tomoe Points 704
cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd - 

devrait faire le travail en une seule ligne. Cela fonctionne également pour les fichiers cachés. "*" n'étend pas les fichiers cachés par l'expansion du nom du chemin, du moins dans bash. Voici mon expérience :

$ mkdir my_directory
$ touch my_directory/file1
$ touch my_directory/file2
$ touch my_directory/.hiddenfile1
$ touch my_directory/.hiddenfile2
$ cd my_directory/ && tar -zcvf ../my_dir.tgz . && cd ..
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2
$ tar ztf my_dir.tgz
./
./file1
./file2
./.hiddenfile1
./.hiddenfile2

2 votes

Cela fonctionne également pour les fichiers contenant des espaces ou d'autres caractères spéciaux. Bon travail !

35 votes

Pas parfait - le fichier tar contient '.' et aussi ./file1 au lieu de file1. J'aime la solution de mateusza ci-dessous d'utiliser --strip-components lors du détartrage.

25 votes

@Ivan si vous remplacez . con * La commande sera donc cd my_directory/ && tar -zcvf ../my_dir.tgz * && cd .. il fonctionnera alors comme vous l'aviez prévu.

65voto

mateusza Points 1452

Vous pouvez également créer une archive comme d'habitude et l'extraire avec :

tar --strip-components 1 -xvf my_directory.tar.gz

3 votes

Cette solution est particulièrement intéressante dans les cas où vous travaillez avec des archives créées avant que toutes vos exigences ne soient connues...

4 votes

Attention --strip-components est une extension GNU.

4 votes

Cette réponse peut être améliorée en fournissant l'exemple "comme d'habitude" dans son contexte.

18voto

mateusza Points 1452
cd my_directory
tar zcvf ../my_directory.tar.gz *

2 votes

Hal a explicitement posé la question des fichiers cachés. Vous avez également besoin de *.

2 votes

-1 : Ceci n'ajoute pas les fichiers cachés au tar. Voir la réponse de tbman.

17voto

Rob Fisher Points 330

Cette réponse devrait fonctionner dans la plupart des situations. Notez cependant que les noms de fichiers sont stockés dans le fichier tar sous la forme suivante, par exemple, ./file1 plutôt que de se contenter de file1 . J'ai constaté que cela posait des problèmes lorsque l'on utilisait cette méthode pour manipuler des fichiers tarballs utilisés comme fichiers de paquets dans BuildRoot .

Une solution consiste à utiliser des gants Bash pour lister tous les fichiers à l'exception de .. comme ceci :

tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *

C'est une astuce que j'ai apprise de cette réponse .

Désormais, tar renverra une erreur s'il n'y a pas de fichiers correspondant aux critères suivants ..?* o .[^.]* mais il fonctionnera quand même. Si l'erreur est un problème (vous vérifiez la réussite dans un script), cela fonctionne :

shopt -s nullglob
tar -C my_dir -zcvf my_dir.tar.gz .[^.]* ..?* *
shopt -u nullglob

Bien que nous soyons en train de jouer avec les options de l'interpréteur de commandes, nous pourrions décider qu'il est plus judicieux d'avoir * correspondre à des fichiers cachés :

shopt -s dotglob
tar -C my_dir -zcvf my_dir.tar.gz *
shopt -u dotglob

Cela peut ne pas fonctionner si les gants de l'interpréteur de commandes * dans le répertoire courant, alors utilisez alternativement :

shopt -s dotglob
cd my_dir
tar -zcvf ../my_dir.tar.gz *
cd ..
shopt -u dotglob

2 votes

J'obtiens des erreurs bizarres lorsque je fais cela tar: start.sh: Cannot stat: No such file or directory Cela se produit pour tous les fichiers de mon répertoire actuel ! Comment éviter cela ?

0 votes

@BrainStone J'obtiens exactement les mêmes résultats.

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