Commande Shell vers le répertoire tar à l'exclusion de certains fichiers / dossiers

y a-t-il une commande/script shell simple qui supporte l'exclusion de certains fichiers/dossiers de l'archivage?

j'ai un répertoire qui doivent être archivés avec un sous-répertoire qui a un certain nombre de très gros fichiers et je n'ai pas besoin de sauvegarde.

Pas assez de solutions:

la commande tar --exclude=PATTERN correspond au modèle donné et exclut ces fichiers, mais j'ai besoin de fichiers et dossiers spécifiques pour être ignoré (chemin complet du fichier), sinon les 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 qui ne fonctionne que pour une petite quantité de fichiers. J'en ai des dizaines de milliers de personnes.

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

est-ce que quelqu'un peut penser à une solution meilleure/plus efficace?

EDIT: cma 's solution works well. Le grand gotcha est que le --exclude='./folder' 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 .
613
demandé sur Rafa 2009-06-12 02:57:31

23 réponses

vous pouvez avoir plusieurs options d'exclusion pour tar so

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

etc fonctionnera. Faites sûr pour mettre --exclude avant la source et les articles de destination.

767
répondu Charles Ma 2017-05-16 08:15:55

vous pouvez exclure les répertoires avec --exclude pour tar.

si vous voulez tout archiver sauf /usr 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
117
répondu Johan Soderberg 2014-12-11 12:13:53

options possibles pour exclure des fichiers / répertoires de la sauvegarde en utilisant tar:

Exclure des fichiers à l'aide de plusieurs modèles de

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

Exclure des fichiers à l'aide d'un fichier exclude rempli avec une liste de modèles

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

exclure les fichiers utilisant des balises en plaçant un fichier de balises dans n'importe quel répertoire qui devrait être sauté

tar -czf backup.tar.gz --exclude-tag-all=exclude.tag /path/to/backup
50
répondu Stephen Donecker 2012-11-08 00:22:34

vieille question avec beaucoup de réponses, mais j'ai trouvé qu'aucun n'était assez assez clair pour moi, donc je voudrais ajouter mon essai.

si vous avez la structure suivante

/home/ftp/mysite/

avec fichier/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 faire un fichier tar qui contient tout à l'intérieur /accueil / ftp / mysite (pour déplacer le site vers un nouveau serveur), mais file3 est juste junk, et tout 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 tels qu'ils sont entrés, utiles pour vous assurer qu'aucun des fichiers que vous excluez n'est ajouté). et f= fichier.

donc, mon commandement 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 que le travail).

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

34
répondu Sverre 2014-05-08 10:48:59

j'en ai fait l'expérience, du 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 une machine Windows XP Home Edition 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

que l'on ne "1519120920 de travail":

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

cela, tandis que tar --help révèle

tar [OPTION...] [FILE]

donc, le second commandement devrait aussi fonctionner, mais apparemment ce n'est pas le cas...

Meilleur rgds,

14
répondu GeertVc 2013-12-31 07:08:41

vous pouvez utiliser la notation standard" ant " pour exclure les répertoires relatifs.

Cela fonctionne pour moi, et exclut toute .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

13
répondu Eric Manley 2015-05-14 14:10:55

j'ai trouvé cela ailleurs donc je ne vais pas prendre le crédit, mais il a fonctionné mieux que l'une des solutions ci-dessus pour mes problèmes spécifiques mac (même si c'est fermé):

tar zc --exclude __MACOSX --exclude .DS_Store -f <archive> <source(s)>
10
répondu Rob 2010-02-05 21:59:16

cela exclut le modèle gère le suffixe de 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}
9
répondu Scott Stensland 2015-02-12 20:55:16

Pour Mac OSX que j'avais à faire

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

Note le -f après le --exclude=

5
répondu Jerinaw 2017-05-06 20:07:56

utilisez la commande find en conjonction 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 la liste des fichiers, créer tar).

find /dir/dir -prune ... -o etc etc.... -exec tar rvf ~/tarfile.tar {} \;
4
répondu Alex B 2009-06-11 23:03:57

pour éviter d'éventuelles erreurs 'xargs: Argument list too long' dues à l'utilisation de find ... | xargs ... lors du traitement de dizaines de milliers de fichiers, vous pouvez Piper la sortie de find directement à tar en utilisant 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 -
4
répondu carlo 2012-03-04 15:18:30

après avoir lu ce fil, j'ai fait un petit test sur RHEL 5 Et voici mes résultats pour ternir le répertoire abc:

cela exclura les erreurs de répertoires et les journaux et tous les fichiers sous les répertoires:

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

Ajouter un joker 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/*'
4
répondu Mike 2014-05-09 22:07:15

je suis d'accord que l'option --exclude est la bonne approche.

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

Un mot de avertissement un effet secondaire que je n'ai pas trouvé immédiatement évident: L'exclusion de ' fileA 'dans cet exemple recherchera' fileA ' récursivement!

exemple: un répertoire avec un sous-répertoire unique contenant un fichier du même nom (données.txt)

data.txt
config.txt
--+dirA
  |  data.txt
  |  config.docx
  • si vous utilisez --exclude='data.txt' , l'archive ne contiendra pas ni .fichier txt. Cela peut provoquer des résultats inattendus si l'archivage des bibliothèques tierces, comme un répertoire node_modules.

  • pour éviter ce problème, assurez-vous de donner le chemin entier, comme --exclude='./dirA/data.txt'

4
répondu Aaron Votre 2016-07-15 15:56:04

Pour ceux qui ont des problèmes avec certaines versions de tar ne fonctionne correctement sans le"./' dans les exclure de la valeur.

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 *
4
répondu J. Lawson 2018-04-18 07:07:32

vous pouvez utiliser cpio(1) pour créer des fichiers tar. cpio prend les fichiers pour archiver sur stdin, donc si vous avez déjà trouvé la commande find que vous voulez utiliser pour sélectionner les fichiers de l'archive, insérez-la dans cpio pour créer le fichier tar:

find ... | cpio -o -H ustar | gzip -c > archive.tar.gz
2
répondu camh 2009-06-12 05:53:17

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

  • --exclude-tag=FILE
  • --exclude-tag-tous=le FICHIER
  • --exclude-tag-sous FICHIER=

le dossier hébergeant le fichier spécifié sera exclu.

2
répondu frommelmak 2012-09-10 14:08:42

gnu tar v 1.26 the --exclude doit venir après les arguments des fichiers d'archives et des répertoires de sauvegarde, ne doit pas avoir de slash, et ne préfère pas de guillemets (simple ou double). Donc par rapport au répertoire PARENT à sauvegarder, c'est:

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

2
répondu Andrew 2014-04-14 16:21:50

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

find / -print0 | xargs -0 tar cjf tarfile.tar.bz2
1
répondu Joe 2009-06-11 23:04:12
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 comprennent pas les noms de fichiers se terminant par ~ dans la sauvegarde.

1
répondu Ashwini Gupta 2018-01-12 10:30:25

réponse redondante Possible mais puisque je l'ai trouvé utile, voici:

pendant que J'utilisais la racine de FreeBSD (c.-à-d. 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 -)

mon point entier est qu'il était nécessaire (en mettant le ./ ) à spécifiez à tar que les annuaires exclus où une partie de la plus grande répertoire à copier.

Mon 0,02 euro

0
répondu Georgios 2013-09-04 22:35:38

Je n'ai pas eu de chance d'obtenir tar pour exclure un sous-répertoire de 5 gigaoctets à quelques niveaux de profondeur. Finalement, j'ai utilisé la commande unix Zip. Ça a été beaucoup plus facile pour moi.

donc pour cet exemple particulier de l'original post

(tar --exclude='./dossier' --exclude='./upload/dossier2' -zcvf /backup/nom de fichier.tgz . )

l'équivalent serait:

zip-r /backup/nom de fichier.zip. -x télécharger/dossier/**\* upload/dossier2/**\*

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

0
répondu user2792605 2017-03-20 10:18:27

Check it out

tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
0
répondu RohitPorwal 2016-07-21 09:56:34

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 permettra d'imprimer la commande dont vous avez besoin et vous pouvez simplement copier et coller dans. Il y a probablement un moyen plus élégant de fournir directement à la ligne de commande.

il suffit de changer *.CC pour toute autre commune de l'extension de fichier, nom de fichier ou regex que vous souhaitez exclure, ce qui devrait encore travailler.

EDIT

juste pour ajouter une petite explication; find génère une liste de fichiers correspondant au regex choisi (dans ce cas *.CC). Cette liste est transmise via xargs à la commande echo. Cette impression --exclut "une entrée de la liste". Les barres obliques () sont des caractères d'échappement pour les marques.

-1
répondu James 2017-05-23 12:02:58