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=PATTERN
commande 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=file
pour 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 .
--exclude
n'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).Réponses:
Vous pouvez avoir plusieurs options d'exclusion pour tar afin
etc fonctionnera. Assurez- vous de mettre
--exclude
avant les éléments source et destination.la source
tar -zcv --exclude='file1' --exclude='patter*' --exclude='file2' -f /backup/filename.tgz .
notez que le-f
drapeau doit précéder le fichier tar voir: superuser.com/a/559341/415047Vous pouvez exclure les répertoires avec
--exclude
for tar.Si vous voulez tout archiver sauf que
/usr
vous pouvez utiliser:Dans votre cas, peut-être quelque chose comme
la source
Options possibles pour exclure des fichiers / répertoires de la sauvegarde à l'aide de tar:
Exclure des fichiers à l'aide de plusieurs modèles
Exclure des fichiers à l'aide d'un fichier d'exclusion rempli d'une liste de modèles
Exclure des fichiers à l'aide de balises en plaçant un fichier de balises dans n'importe quel répertoire devant être ignoré
la source
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
avec les fichiers / dossiers suivants
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
file3
n'est que du courrier indésirable, et toutfolder3
n'est pas nécessaire, nous allons donc ignorer ces deux.nous utilisons le format
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
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)
la source
tar -czvf mysite.tar.gz mysite --exclude='./mysite/file3' --exclude='./mysite/folder3'
, et cela n'excluait rien.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:
myInputFile.txt contient:
/ dev2 / java
/ dev2 / javascript
la source
globstar
soit activée. Vérifiez avecshopt -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. "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:
celui-là n'a pas fonctionné:
Cela
tar --help
révèle tout ce qui suit:Donc, la deuxième commande devrait également fonctionner, mais apparemment, cela ne semble pas être le cas ...
Meilleurs rgds,
la source
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
la source
Pour ceux qui ont des problèmes avec cela, certaines versions de tar ne fonctionneraient correctement sans le './' dans la valeur d'exclusion.
Syntaxe de commande qui fonctionne:
Ceux-ci ne fonctionneront pas:
la source
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é):
la source
COPYFILE_DISABLE=1
lorsque vous utilisez tar, sinon vous pouvez avoir des fichiers ._ dans votre tarballPour Mac OSX, je devais faire
tar -zcv --exclude='folder' -f theOutputTarFile.tar folderToTar
Notez l’
-f
après--exclude=
la source
Je suis d'accord que le drapeau --exclude est la bonne approche.
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)
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'
la source
Pour éviter d'éventuelles
'xargs: Argument list too long'
erreurs dues à l'utilisation defind ... | xargs ...
lors du traitement de dizaines de milliers de fichiers, vous pouvez diriger la sortie defind
directement verstar
usingfind ... -print0 | tar --null ...
.la source
xargs -n 1
est une autre option pour éviter lesxargs: Argument list too long
erreurs;)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:
L'ajout d'un caractère générique après le répertoire exclu exclura les fichiers mais préservera les répertoires:
la source
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).
la source
Vous pouvez également utiliser l'une des options "--exclude-tag" en fonction de vos besoins:
Le dossier hébergeant le FICHIER spécifié sera exclu.
la source
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:
Dans mon cas, pour GNU tar 1.29 sur Debian Stretch, la commande qui fonctionnait était
Les citations n'avaient pas d'importance, cela fonctionnait avec ou sans elles.
J'espère que cela sera utile à quelqu'un.
la source
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:
la source
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
la source
tar (GNU tar) 1.28
.-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.
la source
tar cXvfJ EXCLUDE-LIST ARCHIVE.tar.xz SOURCE-FOLDER
Votre meilleur pari est d'utiliser find avec tar, via xargs (pour gérer le grand nombre d'arguments). Par exemple:
la source
find / -print0 | tar -T- --null --no-recursive -cjf tarfile.tar.bz2
xargs
, on devrait utiliser l'r
option tar au lieu dec
parce que lorsqu'ilfind
trouve 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é parxargs
et pas tous les résultats trouvés par lafind
commande.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 à /):
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 €
la source
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:
(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 )
la source
zip
ne compresse pas les répertoires vides, mais letar
fait!Vérifiez-le
la source
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:
la source
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:
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.
la source
Si vous essayez d'exclure des fichiers VCS (Version Control System), tar prend déjà en charge deux options intéressantes à ce sujet! :)
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
,Mercurial
etDarcs
.À partir de la version 1.32, les fichiers suivants sont exclus:
CVS/
et tout en dessousRCS/
et tout en dessousSCCS/
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
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
,.gitignore
etc.) Cette option offrent cette possibilité.Avant d' archiver un répertoire, voir si elle contient l' un des fichiers suivants:
cvsignore
,.gitignore
,.bzrignore
ou.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ù
.gitfile
se 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: glob
passe à des modèles de globbing shell. La lignesyntax: regexp
revient. Les commentaires commencent par un#
. Les modèles affectent le répertoire et tous ses sous-répertoires.tar -czv --exclude-vcs --exclude-vcs-ignores -f path/to/my-tar-file.tar.gz path/to/my/project/
la source
Le script bash suivant devrait faire l'affaire. Il utilise la réponse donnée ici par Marcus Sundman.
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 '.
la source