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 .
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.
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
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
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)
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,
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
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)>
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}
Pour Mac OSX que j'avais à faire
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Note le -f
après le --exclude=
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 {} \;
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 -
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/*'
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'
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 *
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
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.
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
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
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.
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
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 )
Check it out
tar cvpzf zip_folder.tgz . --exclude=./public --exclude=./tmp --exclude=./log --exclude=fileName
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.