1126 votes

Commande Shell permettant de tarifier un répertoire en excluant certains fichiers/dossiers

Existe-t-il une commande shell simple/script qui permet d'exclure certains fichiers/dossiers de l'archivage ?

J'ai un répertoire qui doit être archivé avec un sous-répertoire qui contient un certain nombre de très gros fichiers que je n'ai pas besoin de sauvegarder.

Pas tout à fait des solutions :

Le site tar --exclude=PATTERN correspond au modèle donné et exclut ces fichiers, mais j'ai besoin que des fichiers et dossiers spécifiques soient ignorés (chemin d'accès complet), sinon des fichiers valides pourraient être exclus.

Je pourrais aussi utiliser la commande find pour créer une liste de fichiers et exclure ceux que je ne veux pas archiver et passer la liste à tar, mais cela ne fonctionne que pour une petite quantité de fichiers. J'en ai des dizaines de milliers.

Je commence à penser que la seule solution est de créer un fichier avec une liste de fichiers/dossiers à exclure, puis d'utiliser rsync avec --exclude-from=file pour copier tous les fichiers dans un répertoire tmp, et ensuite utiliser tar pour archiver ce répertoire.

Quelqu'un peut-il penser à une solution meilleure/plus efficace ?

EDIT : Charles Ma La solution de l'auteur fonctionne bien. Le gros problème est que le --exclude='./folder' MUST être au début de la commande tar. Commande complète (cd en premier, pour que la sauvegarde soit relative à ce répertoire) :

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

178 votes

Une autre chose m'a surpris, ça vaut peut-être la peine d'être noté : Barre oblique de fin à la fin des dossiers exclus fera en sorte que tar pas exclure ces dossiers du tout.

7 votes

Merci @Rekhyt, j'ai fixé la commande pendant 15 minutes ... puis 30.

12 votes

Il semble que la position de --exclude dépende de la version de tar. Pour tar 1.23, --exclude doit venir après les commandes principales.

1451voto

Charles Ma Points 12330

Vous pouvez avoir plusieurs options d'exclusion pour le goudron, ainsi

$ tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .

etc. fonctionneront. Faire sûr pour mettre --exclude avant les éléments source et destination.

0 votes

Pouvez-vous donner un exemple de modèle. S'agit-il d'un modèle regex ?

0 votes

Non. Ce n'est pas un RegExp. Le site * signifie ici tout caractère (y compris / ).

103 votes

Cette réponse donne l'impression que --exclude vient en premier... tar cvfpz ../stuff.tgz --exclude='node_modules' --exclude='.git' .

161voto

Johan Soderberg Points 976

Vous pouvez exclure des répertoires avec --exclude pour le goudron.

Si vous voulez archiver tout sauf /usr que vous pouvez utiliser :

tar -zcvf /all.tgz / --exclude=/usr

Dans votre cas, peut-être quelque chose comme

tar -zcvf archive.tgz arc_dir --exclude=dir/ignore_this_dir

23 votes

Pour clarifier, vous pouvez utiliser le chemin complet pour --exclude.

9 votes

Dans certains cas, il est nécessaire que --exclude précède les fichiers/dossiers à archiver.

2 votes

Attention --exclude=dir/ignore_this_dir correspondra dans tout ainsi que le sous-arbre ! Vous finirez par manquer des fichiers dont vous ne vous attendiez pas à ce qu'ils soient exclus.

90voto

Stephen Donecker Points 424

Options possibles pour exclure les fichiers/répertoires de la sauvegarde à l'aide de tar :

Exclure des fichiers en utilisant plusieurs modèles

tar -czf backup.tar.gz --exclude=PATTERN1 --exclude=PATTERN2 ... /path/to/backup

Exclure des fichiers à l'aide d'un fichier d'exclusion rempli d'une liste de motifs

tar -czf backup.tar.gz -X /path/to/exclude.txt /path/to/backup

Exclure des fichiers à l'aide de balises en plaçant un fichier de balises dans tout répertoire qui doit être ignoré.

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup

4 votes

L'ordre des paramètres semble avoir de l'importance et cette forme fonctionne pour moi.

1 votes

Moi aussi. Pour tar (GNU tar) 1.28 sur Ubuntu 16.04, seul cet ordre spécifique de paramètres a fonctionné.

70voto

user1201232 Points 141

Une vieille question avec de nombreuses réponses, mais j'ai trouvé qu'aucune n'était assez claire pour moi, alors je voudrais ajouter mon essai.

si vous avez la structure suivante

/home/ftp/mysite/

avec les fichiers/dossiers suivants

/home/ftp/mysite/file1
/home/ftp/mysite/file2
/home/ftp/mysite/file3
/home/ftp/mysite/folder1
/home/ftp/mysite/folder2
/home/ftp/mysite/folder3

Vous voulez donc créer un fichier tar contenant tout ce qui se trouve dans /home/ftp/mysite (pour déplacer le site vers un nouveau serveur), mais file3 est juste de la camelote, et tout ce qui est dans folder3 n'est pas non plus nécessaire, nous allons donc sauter ces deux-là.

nous utilisons le format

tar -czvf <name of tar file> <what to tar> <any excludes>

où c = create, z = zip, et v = verbose (vous pouvez voir les fichiers au fur et à mesure qu'ils sont saisis, utile pour s'assurer qu'aucun des fichiers que vous excluez n'est ajouté). et f= fichier.

Ainsi, ma commande ressemblerait à ceci

cd /home/ftp/
tar -czvf mysite.tar.gz mysite --exclude='file3' --exclude='folder3'

Notez que les fichiers/dossiers exclus sont relatifs à la racine de votre tar (j'ai essayé le chemin complet ici relatif à / mais je n'arrive pas à le faire fonctionner).

J'espère que cela aidera quelqu'un (et moi la prochaine fois que je le chercherai sur Google).

0 votes

J'aurais bien ajouté un commentaire sur certaines des autres bonnes réponses, mais je n'avais pas le karma nécessaire, j'ai donc décidé de faire une réponse complète.

7 votes

Cette réponse m'a définitivement aidé ! Le problème pour moi était que ma commande ressemblait à quelque chose comme tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3' et cela n'excluait rien.

2 votes

Votre échantillon était très similaire à celui qui m'a posé problème ! Merci !

19voto

GeertVc Points 306

J'ai fait l'expérience de cela, au moins avec les Cygwin version de tar que j'utilise ("CYGWIN_NT-5.1 1.7.17(0.262/5/3) 2012-10-19 14:39 i686 Cygwin" sur une machine Windows XP Home Edition SP3), l'ordre des options est important.

Bien que cette construction ait fonctionné pour moi :

tar cfvz target.tgz --exclude='<dir1>' --exclude='<dir2>' target_dir

celui-là n'a pas travail :

tar cfvz --exclude='<dir1>' --exclude='<dir2>' target.tgz target_dir

Ceci, alors que tar --help révèle les éléments suivants :

tar [OPTION...] [FILE]

Donc, la deuxième commande devrait aussi fonctionner, mais apparemment ce n'est pas le cas...

Meilleurs vœux,

6 votes

Je veux juste ajouter à ce qui précède qu'il est important que le répertoire à exclure ne contienne PAS de backslash final. Donc, --exclude='/path/to/exclude/dir' (répertoire) est CORRECT , --exclude='/path/to/exclude/dir/' est MAUVAIS .

21 votes

C'est parce que l'archive cible target.tgz est un argument du commutateur f, qu'il devrait suivre

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