Commande shell vers le répertoire tar excluant certains fichiers / dossiers

812

Existe-t-il une commande / script shell simple qui prend en charge l'exclusion de certains fichiers / dossiers de l'archivage?

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

Pas tout à fait des solutions:

La tar --exclude=PATTERNcommande correspond au modèle donné et exclut ces fichiers, mais j'ai besoin de fichiers et dossiers spécifiques à ignorer (chemin d'accès complet), sinon des fichiers valides pourraient être exclus.

Je pourrais également utiliser la commande find pour créer une liste de fichiers et exclure ceux que je ne veux pas archiver et transmettre la liste à tar, mais cela ne fonctionne qu'avec 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=filepour copier tous les fichiers dans un répertoire tmp, puis d'utiliser tar pour archiver ce répertoire.

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

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

cd /folder_to_backup
tar --exclude='./folder' --exclude='./upload/folder2' -zcvf /backup/filename.tgz .
puits profond
la source
121
Une autre chose m'a attiré là-dessus, pourrait valoir la peine d'être notée : les barres obliques à la fin des dossiers exclus empêcheront tar de ne pas exclure ces dossiers du tout.
Rekhyt
7
@Rekhyt merci, je regardais la commande depuis 15 minutes ... puis 30
earcam
9
Il semble que la position de --exclude dépend de la version de tar. Pour tar 1.23, --exclude doit venir après les commandes principales.
Joel G Mathew
2
N'oubliez pas les "'" (guillemets).
Meetai.com
3
--excluden'a pas besoin d'être le premier mais il doit venir quelque part avant le répertoire source (testé avec tar 1.29 sur Cygwin).
wortwart

Réponses:

1038

Vous pouvez avoir plusieurs options d'exclusion pour tar afin

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

etc fonctionnera. Assurez- vous de mettre --exclude avant les éléments source et destination.

Charles Ma
la source
78
Cette réponse donne l'impression que --exclude vient en premier ... tar cvfpz ../stuff.tgz --exclude = 'node_modules' --exclude = '. Git'.
James O'Brien
13
Par exemple, si vous essayez de sauvegarder votre dossier de projet wordpress, à l'exclusion du dossier uploads, vous pouvez utiliser cette commande: tar -cvf wordpress_backup.tar wordpress --exclude = wp-content / uploads
shasi kanth
12
Je suis venu avec la commande suivante: tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz . notez que le -fdrapeau doit précéder le fichier tar voir: superuser.com/a/559341/415047
Alfred Bez
21
Un "/" à la fin du répertoire d'exclusion entraînera son échec. Je suppose que tar pense qu'une terminaison / fait partie du nom du répertoire à exclure. MAUVAIS: --exclude = mydir / BON: --exclude = mydir
Josiah
4
> Assurez-vous de mettre --exclude avant les éléments source et destination. OU utilisez un chemin absolu pour l'exclusion: tar -cvpzf backups / target.tar.gz --exclude = '/ home / username / backups' / home / username
NightKnight on Cloudinsidr.com
131

Vous pouvez exclure les répertoires avec --excludefor tar.

Si vous voulez tout archiver sauf que /usrvous 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
Johan Soderberg
la source
17
Pour clarifier, vous pouvez utiliser le chemin complet pour --exclude.
Johan Soderberg
2
dans certains cas, il est nécessaire que --exclude précède les fichiers / dossiers à archiver
kronuus
68

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

Exclure des fichiers à l'aide de 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 modèles

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 n'importe quel répertoire devant être ignoré

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
Stephen Donecker
la source
3
L'ordre des paramètres semble avoir de l'importance et cette forme fonctionne pour moi.
cstamas
1
Moi aussi. Pour tar (GNU tar) 1.28 sur Ubuntu 16.04, seul cet ordre spécifique de paramètres fonctionnait.
alvaroreig
43

vieille question avec de nombreuses réponses, mais j'ai trouvé qu'aucune n'était assez claire pour moi, donc 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

Donc, vous voulez créer un fichier tar qui contient tout dans / home / ftp / mysite (pour déplacer le site vers un nouveau serveur), mais ce file3n'est que du courrier indésirable, et tout folder3n'est pas nécessaire, nous allons donc ignorer ces deux.

nous utilisons le format

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

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

donc ma commande ressemblerait à ceci

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

notez que les fichiers / dossiers exclus sont relativement à la racine de votre tar (j'ai essayé le chemin complet ici par rapport à / mais je ne peux pas faire fonctionner cela).

j'espère que cela aidera quelqu'un (et moi la prochaine fois que je google)

Sverre
la source
6
Cette réponse m'a définitivement aidé! Le piège pour moi était que ma commande ressemblait à quelque chose tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3', et cela n'excluait rien.
Anish Ramaswamy
2
Votre échantillon était très similaire à ce que j'avais problème! Je vous remercie!
Qorbani
2
Joli et clair merci. Pour moi, le problème était que d'autres réponses incluent des chemins absolus ou relatifs. Mais il vous suffit d'ajouter le nom du dossier que vous souhaitez exclure.
Hubert
2
C'est une réponse beaucoup plus claire. Grâce à l'exemple, j'ai pu le faire fonctionner car les chemins étaient déroutants au début. Merci beaucoup!
fagiani
2
ça a marché! N'oubliez pas de ne pas ajouter de barre oblique à l'exclusion. Par exemple, alors que "fichier3" ou "fichier3 / sous-dossier" fonctionne, "fichier3 /" et "fichier3 / sous-dossier /" ne fonctionnent pas!
lucaferrario
24

Vous pouvez utiliser la "notation ant" standard pour exclure les répertoires relatifs.
Cela fonctionne pour moi et exclut tous les répertoires .git ou node_module:

tar -cvf myFile.tar --exclude=**/.git/* --exclude=**/node_modules/*  -T /data/txt/myInputFile.txt 2> /data/txt/myTarLogFile.txt

myInputFile.txt contient:

/ dev2 / java
/ dev2 / javascript

Eric Manley
la source
4
Je crois que cela nécessite que la variable d'option du shell Bash globstarsoit activée. Vérifiez avec shopt -s globstar. Je pense qu'il est désactivé par défaut sur la plupart des systèmes d'exploitation basés sur Unix. D'après le manuel de Bash: " globstar: s'il est défini, le modèle **utilisé dans un contexte d'extension de nom de fichier correspondra à tous les fichiers et à zéro ou plusieurs répertoires et sous-répertoires. Si le modèle est suivi d'un '/', seuls les répertoires et sous-répertoires correspondent. "
not2qubit
15

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

Alors que cette construction a fonctionné pour moi:

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

celui-là n'a pas fonctionné:

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

Cela tar --helprévèle tout ce qui suit:

tar [OPTION...] [FILE]

Donc, la deuxième commande devrait également fonctionner, mais apparemment, cela ne semble pas être le cas ...

Meilleurs rgds,

GeertVc
la source
5
Je veux juste ajouter à ce qui précède, qu'il est important que le répertoire à exclure ne contienne PAS de barre oblique inverse finale. Ainsi, --exclude = '/ path / to / exclude / dir' est CORRECT , --exclude = '/ path / to / exclude / dir /' est FAUX .
GeertVc
17
c'est parce que l'archive cible target.tgz est un argument du commutateur f, qu'il devrait suivre
Valentino
14

Ce modèle d'exclusion gère le suffixe du nom de fichier comme png ou mp3 ainsi que les noms de répertoire comme .git et node_modules

tar --exclude={*.png,*.mp3,*.wav,.git,node_modules} -Jcf ${target_tarball}  ${source_dirname}
Scott Stensland
la source
merci - c'est ce que je cherchais :)
Alexander Br.
11

Pour ceux qui ont des problèmes avec cela, certaines versions de tar ne fonctionneraient correctement sans le './' dans la valeur d'exclusion.

Tar --version

tar (GNU tar) 1.27.1

Syntaxe de commande qui fonctionne:

tar -czvf ../allfiles-butsome.tar.gz * --exclude=acme/foo

Ceux-ci ne fonctionneront pas:

$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=./acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='./acme/foo'
$ tar --exclude=./acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='./acme/foo' -czvf ../allfiles-butsome.tar.gz *
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude=/full/path/acme/foo
$ tar -czvf ../allfiles-butsome.tar.gz * --exclude='/full/path/acme/foo'
$ tar --exclude=/full/path/acme/foo -czvf ../allfiles-butsome.tar.gz *
$ tar --exclude='/full/path/acme/foo' -czvf ../allfiles-butsome.tar.gz *
J. Lawson
la source
10

J'ai trouvé cela ailleurs, donc je ne prendrai pas le crédit, mais cela a mieux fonctionné que toutes les solutions ci-dessus pour mes problèmes spécifiques à Mac (même si cela est fermé):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
Rob
la source
2
Merci pour cette réponse, le tar sur darwin a définitivement une syntaxe différente et cela me rendait fou pourquoi "--exclude = blah" dans les autres réponses ne fonctionnait pas. Cela fonctionnait très bien sur un mac.
Michael
1
N'oubliez pas COPYFILE_DISABLE=1lorsque vous utilisez tar, sinon vous pouvez avoir des fichiers ._ dans votre tarball
Benoit Duffez
Merci d'avoir inclus votre réponse. Il est toujours agréable d'inclure un lien vers la source où vous avez trouvé la réponse. Bonus: si la source provenait d'un autre post stackoverflow ou stackexchange, vous obtenez un karma supplémentaire (soit des points soit des badges - je ne me souviens pas lequel). De toute façon, ils ont le sourire et tout le monde y gagne. Pas d'inconvénients :-) Il aide également les gens qui souhaitent rechercher des informations supplémentaires. Parfois, les gens votent simplement parce que vous avez inclus un lien source. Enfin, en partageant le problème spécifique résolu, ou pourquoi c'était une meilleure solution, cela pourrait aider quelqu'un d'autre avec un problème unique.
SherylHohman
8

Pour Mac OSX, je devais faire

tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar

Notez l’ -faprès--exclude=

Jerinaw
la source
6

Je suis d'accord que le drapeau --exclude est la bonne approche.

$ tar --exclude='./folder_or_file' --exclude='file_pattern' --exclude='fileA'

Un mot d' avertissement pour un effet secondaire que je n'ai pas trouvé immédiatement évident: L'exclusion de 'fileA' dans cet exemple va rechercher 'fileA' RECURIVEMENT!

Exemple: un répertoire avec un seul sous-répertoire contenant un fichier du même nom (data.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • Si vous utilisez --exclude='data.txt'l'archive ne contient NI fichier data.txt. Cela peut entraîner des résultats inattendus lors de l'archivage de bibliothèques tierces, comme un répertoire node_modules.

  • Pour éviter ce problème, assurez-vous d'indiquer le chemin complet, comme --exclude='./dirA/data.txt'

Aaron Votre
la source
5

Pour éviter d'éventuelles 'xargs: Argument list too long'erreurs dues à l'utilisation de find ... | xargs ...lors du traitement de dizaines de milliers de fichiers, vous pouvez diriger la sortie de finddirectement vers tarusing find ... -print0 | tar --null ....

# archive a given directory, but exclude various files & directories 
# specified by their full file paths
find "$(pwd -P)" -type d \( -path '/path/to/dir1' -or -path '/path/to/dir2' \) -prune \
   -or -not \( -path '/path/to/file1' -or -path '/path/to/file2' \) -print0 | 
   gnutar --null --no-recursion -czf archive.tar.gz --files-from -
   #bsdtar --null -n -czf archive.tar.gz -T -
carlo
la source
vous pouvez citer la chaîne 'exclude', comme ceci: 'somedir / filesdir / *' alors le shell ne développera pas les astérisques et autres caractères blancs.
Znik
xargs -n 1est une autre option pour éviter les xargs: Argument list too longerreurs;)
Tuxdude
5

Après avoir lu ce fil de discussion, j'ai fait un petit test sur RHEL 5 et voici mes résultats pour tarifier le répertoire abc:

Cela exclura l'erreur des répertoires et les journaux et tous les fichiers sous les répertoires:

tar cvpzf abc.tgz abc/ --exclude='abc/error' --exclude='abc/logs'

L'ajout d'un caractère générique après le répertoire exclu exclura les fichiers mais préservera les répertoires:

tar cvpzf abc.tgz abc/ --exclude='abc/error/*' --exclude='abc/logs/*'
Mike
la source
Dans le deuxième exemple ci-dessus, il devrait y avoir des astérisques après la dernière barre oblique dans chaque clause d'exclusion, mais le message ne les a pas pris.
Mike
4

Utilisez la commande find conjointement avec l'option tar append (-r). De cette façon, vous pouvez ajouter des fichiers à un tar existant en une seule étape, au lieu d'une solution à deux passes (créer une liste de fichiers, créer tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
Alex B
la source
4

Vous pouvez également utiliser l'une des options "--exclude-tag" en fonction de vos besoins:

  • --exclude-tag = FICHIER
  • --exclude-tag-all = FICHIER
  • --exclude-tag-under = FICHIER

Le dossier hébergeant le FICHIER spécifié sera exclu.

frommelmak
la source
4

Après avoir lu toutes ces bonnes réponses pour différentes versions et avoir résolu le problème par moi-même, je pense qu'il y a de très petits détails qui sont très importants, et rares pour une utilisation générale GNU / Linux , qui ne sont pas assez soulignés et méritent plus que des commentaires.

Je ne vais donc pas essayer de répondre à la question pour chaque cas, mais au lieu de cela, essayez d'enregistrer où chercher lorsque les choses ne fonctionnent pas.

IL EST TRÈS IMPORTANT DE NOTER:

  1. L'ORDRE DES OPTIONS EST IMPORTANT: ce n'est pas la même chose de mettre --exclude avant qu'après l'option de fichier et les répertoires à sauvegarder. C'est du moins inattendu pour moi, car d'après mon expérience, dans les commandes GNU / Linux, généralement l'ordre des options n'a pas d'importance.
  2. Différentes versions de tar attendent ces options dans un ordre différent: par exemple, la réponse de @ Andrew indique que dans GNU tar v 1.26 et 1.28, les exclusions sont les dernières, alors que dans mon cas, avec GNU tar 1.29, c'est l'inverse.
  3. L'IMPORTANT TRAILING SLASHES : au moins dans GNU tar 1.29, il ne devrait pas y en avoir .

Dans mon cas, pour GNU tar 1.29 sur Debian Stretch, la commande qui fonctionnait était

tar --exclude="/home/user/.config/chromium" --exclude="/home/user/.cache" -cf file.tar  /dir1/ /home/ /dir3/

Les citations n'avaient pas d'importance, cela fonctionnait avec ou sans elles.

J'espère que cela sera utile à quelqu'un.

user2553863
la source
Merci pour votre réponse. Je cherchais (ce qui m'a paru très longtemps) une solution, et votre réponse m'a guidé dans la bonne direction. Cependant, dans mon cas (Ubuntu 18.04.3, Tar 1.29), je ne pouvais que le faire fonctionner en ajoutant le nom du dossier et NON le chemin, par exemple: tar --exclude = folder1 --exclude = folder2 -czvf / opt / archieve. Dossier tgz
Nitai
2

Vous pouvez utiliser cpio (1) pour créer des fichiers tar. cpio prend les fichiers à archiver sur stdin, donc si vous avez déjà compris la commande find que vous souhaitez utiliser pour sélectionner les fichiers à archiver, canalisez-les dans cpio pour créer le fichier tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
camh
la source
2

gnu tar v 1.26 --exclude doit venir après les arguments du fichier d'archive et du répertoire de sauvegarde, ne doit avoir ni barre oblique ni barre oblique, et ne préfère pas les guillemets (simples ou doubles). Donc par rapport au répertoire PARENT à sauvegarder, c'est:

tar cvfz /path_to/mytar.tgz ./dir_to_backup --exclude=some_path/to_exclude

Andrew
la source
Après de nombreuses expérimentations, j'ai trouvé plus ou moins la même chose avec ma commande tar (GNU tar) 1.28.
PicoutputCls
2
tar -cvzf destination_folder source_folder -X /home/folder/excludes.txt

-X indique un fichier qui contient une liste de noms de fichiers qui doivent être exclus de la sauvegarde. Par exemple, vous pouvez spécifier * ~ dans ce fichier pour ne pas inclure de noms de fichiers se terminant par ~ dans la sauvegarde.

Ashwini Gupta
la source
Je pense que c'est la meilleure solution, car cela fonctionne même dans ces cas, que le nombre d'exclusions est important. Il est également possible d'inclure l'option X dans le pack d'options, donc la forme la plus courte est probablement:tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Kai Petzke
0

Votre meilleur pari est d'utiliser find avec tar, via xargs (pour gérer le grand nombre d'arguments). Par exemple:

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
Joe
la source
4
Cela peut provoquer l'invocation de tar plusieurs fois - et également compresser des fichiers à plusieurs reprises. Le correct est:find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
jørgensen
J'ai lu quelque part que lors de l'utilisation xargs, on devrait utiliser l' roption tar au lieu de cparce que lorsqu'il findtrouve réellement des charges de résultats, les xargs diviseront ces résultats (en fonction de la limite des arguments de la ligne de commande locale) en morceaux et invoqueront tar sur chaque partie. Cela se traduira par une archive contenant le dernier chunck retourné par xargset pas tous les résultats trouvés par la findcommande.
Stéphane
0

Réponse redondante possible mais comme je l'ai trouvée utile, la voici:

En tant que racine FreeBSD (c'est-à-dire en utilisant csh), je voulais copier tout mon système de fichiers racine dans / mnt mais sans / usr et (évidemment) / mnt. C'est ce qui a fonctionné (je suis à /):

tar --exclude ./usr --exclude ./mnt --create --file - . (cd /mnt && tar xvd -)

Tout mon point est qu'il était nécessaire (en mettant le ./ ) de spécifier au tar que les répertoires exclus où une partie du plus grand répertoire était copié.

Mon 0,02 €

George
la source
0

Je n'ai pas eu de chance d'obtenir tar pour exclure un sous-répertoire de 5 gigaoctets à quelques niveaux de profondeur. Au final, je viens d'utiliser la commande Zip unix. Cela a fonctionné beaucoup plus facilement pour moi.

Donc, pour cet exemple particulier de la publication d'origine
(tar --exclude = '. / Folder' --exclude = '. / Upload / folder2' -zcvf /backup/filename.tgz.)

L'équivalent serait:

zip -r /backup/filename.zip. -x téléchargement / dossier / ** \ * téléchargement / dossier2 / ** \ *

(REMARQUE: voici le message que j'ai utilisé à l'origine qui m'a aidé /superuser/312301/unix-zip-directory-but-excluded-specific-subdirectories-and-everything-within-t )

user2792605
la source
3
Attention: zipne compresse pas les répertoires vides, mais le tarfait!
t0r0X
0

Vérifiez-le

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
RohitPorwal
la source
0

Je veux avoir une nouvelle version front-end (dossier angulaire) sur localhost. De plus, le dossier git est énorme dans mon cas, et je veux l'exclure. Je dois le télécharger à partir du serveur et le décompresser pour exécuter l'application.

Compressez le dossier angulaire à partir de / var / lib / tomcat7 / webapps, déplacez-le vers le dossier / tmp avec le nom angular.23.12.19.tar.gz

Commande:

tar --exclude='.git' -zcvf /tmp/angular.23.12.19.tar.gz /var/lib/tomcat7/webapps/angular/
dobrivoje
la source
0

Cas de réussite: 1) si vous donnez le chemin complet pour prendre la sauvegarde, en exclure, vous devez également utiliser le chemin complet.

tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' / opt / ABC

2) si vous donnez le chemin actuel pour effectuer la sauvegarde, en exclure également, vous devez utiliser le chemin actuel uniquement.

tar -zcvf backup_27032020.tar.gz --exclude = 'ABC / csv / ' --exclude = 'ABC / log / ' ABC

Cas d'échec:

  1. si vous donnez le répertoire currentpath pour prendre la sauvegarde et le chemin complet à ignorer, alors ne fonctionnera pas

    tar -zcvf /opt/ABC/BKP_27032020/backup_27032020.tar.gz --exclude = '/ opt / ABC / csv / ' --exclude = '/ opt / ABC / log / ' ABC

Remarque: mentionner exclure le répertoire de sauvegarde avant / après est correct.

Sridhar Kumar N
la source
0

Si vous essayez d'exclure des fichiers VCS (Version Control System), tar prend déjà en charge deux options intéressantes à ce sujet! :)

  1. Option: --exclude-vcs

Cette option exclut les fichiers et répertoires utilisés en suivant les systèmes de contrôle de version: CVS, RCS, SCCS, SVN, Arch, Bazaar, Mercurialet Darcs.

À partir de la version 1.32, les fichiers suivants sont exclus:

  • CVS/et tout en dessous
  • RCS/et tout en dessous
  • SCCS/et tout en dessous
  • .git/et tout en dessous
  • .gitignore
  • .gitmodules
  • .gitattributes
  • .cvsignore
  • .svn/et tout en dessous
  • .arch-ids/et tout en dessous
  • {arch}/et tout en dessous
  • =RELEASE-ID
  • =meta-update
  • =update
  • .bzr
  • .bzrignore
  • .bzrtags
  • .hg
  • .hgignore
  • .hgrags
  • _darcs

    1. Option: --exclude-vcs-ignores

Lors de l' archivage des répertoires qui sont sous un système de contrôle de version (VCS), il est souvent commode de lire des motifs d'exclusion de ce VCS » ignorer les fichiers (par exemple .cvsignore, .gitignoreetc.) Cette option offrent cette possibilité.

Avant d' archiver un répertoire, voir si elle contient l' un des fichiers suivants: cvsignore, .gitignore, .bzrignoreou .hgignore. Dans l'affirmative, lisez ignorer les modèles de ces fichiers.

Les modèles sont traités de la même manière que le VCS correspondant les traiterait, à savoir:

.cvsignore

Contient des modèles de globalisation de style shell qui s'appliquent uniquement au répertoire où réside ce fichier. Aucun commentaire n'est autorisé dans le fichier. Les lignes vides sont ignorées.

.gitignore

Contient des motifs globbing de style coque. S'applique au répertoire où .gitfilese trouve et à tous ses sous-répertoires.

Toute ligne commençant par un #est un commentaire. La barre oblique inverse échappe au caractère de commentaire.

.bzrignore

Contient des motifs globbing shell et des expressions régulières (si préfixé avec RE:(16). Les motifs affectent le répertoire et tous ses sous-répertoires.

Toute ligne commençant par un #est un commentaire.

.hgignore

Contient des expressions régulières posix (17). La ligne syntax: globpasse à des modèles de globbing shell. La ligne syntax: regexprevient. Les commentaires commencent par un #. Les modèles affectent le répertoire et tous ses sous-répertoires.

  1. Exemple

tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/

TM
la source
-1

Le script bash suivant devrait faire l'affaire. Il utilise la réponse donnée ici par Marcus Sundman.

#!/bin/bash

echo -n "Please enter the name of the tar file you wish to create with out extension "
read nam

echo -n "Please enter the path to the directories to tar "
read pathin

echo tar -czvf $nam.tar.gz
excludes=`find $pathin -iname "*.CC" -exec echo "--exclude \'{}\'" \;|xargs`
echo $pathin

echo tar -czvf $nam.tar.gz $excludes $pathin

Cela imprimera la commande dont vous avez besoin et vous pouvez simplement la copier et la coller à nouveau. Il existe probablement un moyen plus élégant de la fournir directement à la ligne de commande.

Modifiez simplement * .CC pour toute autre extension, nom de fichier ou expression régulière que vous souhaitez exclure et cela devrait toujours fonctionner.

ÉDITER

Juste pour ajouter une petite explication; find génère une liste de fichiers correspondant à l'expression rationnelle choisie (dans ce cas * .CC). Cette liste est transmise via xargs à la commande echo. Ceci imprime --exclure 'une entrée de la liste'. Les barres obliques () sont des caractères d'échappement pour les marques '.

James
la source
1
Exiger une entrée interactive est un mauvais choix de conception pour la plupart des scripts shell. Faites-le lire les paramètres de ligne de commande à la place et vous bénéficiez de l'achèvement de l'onglet du shell, de l'achèvement de l'historique, de la modification de l'historique, etc.
tripleee
1
En outre, votre script ne fonctionne pas pour les chemins d'accès qui contiennent des espaces blancs ou des métacaractères shell. Vous devez fondamentalement toujours mettre les variables entre guillemets, sauf si vous avez spécifiquement besoin du shell pour effectuer la tokenisation des espaces blancs et l'expansion des caractères génériques. Pour plus de détails, veuillez consulter stackoverflow.com/questions/10067266/…
tripleee