J'ai cette ligne très simple dans un script bash qui s'exécute avec succès (c.-à-d. La production du _data.tar
fichier), sauf qu'elle n'exclut pas les sous-répertoires qu'il est dit d'exclure via l' --exclude
option:
/bin/tar -cf /home/_data.tar --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*' /data
Au lieu de cela, il produit un _data.tar
fichier contenant tout ce qui se trouve sous / data, y compris les fichiers des sous-répertoires que je voulais exclure.
Une idée pourquoi? et comment résoudre ce problème?
Mise à jour J'ai mis en œuvre mes observations sur la base du lien fourni dans la première réponse ci-dessous (répertoire de premier niveau en premier, pas d'espace après la dernière exclusion):
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1/*' --exclude='/data/sub2/*' --exclude='/data/sub3/*' --exclude='/data/sub4/*' --exclude='/data/sub5/*'
Mais ça n'a pas aidé. Tous les sous-répertoires "exclus" sont présents dans le _data.tar
fichier résultant .
C'est curieux. Qu'il s'agisse d'un bogue dans le tar actuel (GNU tar 1.23, sur CentOS 6.2, Linux 2.6.32) ou de "l'extrême sensibilité" du tar aux espaces et autres fautes de frappe faciles à oublier, je considère cela comme un bogue. Pour l'instant.
C'est horrible : j'ai essayé les idées suggérées ci-dessous (pas de fin /*
) et cela ne fonctionne toujours pas dans le script de production:
/bin/tar -cf /home/_data.tar /data --exclude='/data/sub1' --exclude='/data/sub2' --exclude='/data/sub3' --exclude='/data/sub4'
Je ne vois aucune différence entre ce que j'ai essayé et ce que @Richard Perrin a essayé, à l'exception des guillemets et de 2 espaces au lieu de 1. Je vais essayer (cela doit attendre que le script nocturne soit exécuté comme répertoire à sauvegarder) est énorme) et faire rapport.
/bin/tar -cf /home/_data.tar /data --exclude=/data/sub1 --exclude=/data/sub2 --exclude=/data/sub3 --exclude=/data/sub4
Je commence à penser que toutes ces tar --exclude
sensibilités ne sont pas du goudron, mais quelque chose dans mon environnement, mais alors qu'est-ce que cela pourrait être?
Ça a marché! La dernière variante essayée (pas de guillemets simples et d’espaces simples au lieu de doubles espaces entre les --exclude
s) a fonctionné. Bizarre mais acceptant.
Incroyable! Il s'avère qu'une ancienne version de tar
(1.15.1) exclut uniquement si le répertoire de niveau supérieur est le dernier sur la ligne de commande. C’est exactement le contraire de la version 1.23. FYI.
--exclude b
(espace au lieu de signe égal) contre--exclude=b
. Cela fait-il une différence? (ne devrait pas IMHO)--exclude=
sur la même ligne. Donc, la différence doit être l'idiot/*
que j'ai ajouté à chaque sous-répertoire. Je vais tester cela ce soir dans le script de production et faire rapport. Un autre +1.Il se peut que votre version de
tar
nécessite que les--exclude
options soient placées au début de latar
commande.Voir: https://stackoverflow.com/q/984204
Voir: http://mandrivausers.org/index.php?/topic/8585-multiple-exclude-in-tar/
Alternative:
Voici un autre
tar
conseil de commande :la source
--exclude=mydir/*
alors il ne fonctionne pas (avectar --exclude=maindir/mydir/* -cjf archive.tar2.bz2 maindir/*
).tar --version
); Debian sera probablement livré avec de nombreuses versions différentes de goudron au fil des ans.--exclude
avant-czf
.Pour exclure plusieurs fichiers, essayez
Cela économisera du code et des maux de tête. Ceci est une solution globale, pour tout type de programmes / options. Si vous souhaitez également inclure le répertoire parent dans votre sélection (dans ce cas, les données), vous devez inclure une virgule de fin. Par exemple:
la source
mv /very/very/very/very/long/path/to/a/file{,.bak}
Ce lien pourrait être utile. http://answers.google.com/answers/threadview/id/739467.html
Deux différences immédiates entre la ligne qui ne fonctionne pas et quelques astuces dans le lien:
--exclude
.la source
-MAK
attiré mon attention et jusqu'à présent, j'ai pu identifier les différences suivantes entre ma ligne qui ne fonctionnait pas et les suivantes: 1. Tous les éléments exclus viennent après le répertoire de niveau supérieur. 2. Ne peut avoir AUCUN espace après le dernier--exclude
. Je vais tester ces informations et faire rapport. +1 pour l'instant.Une solution de contournement peut consister à utiliser une combinaison de
find ... -prune
ettar
à exclure les répertoires spécifiés.Sur Mac OS X, l’
--exclude
option de GNUtar
semble fonctionner comme il se doit.Dans le cas de test suivant les répertoires
/private/var/log/asl
et/private/var/log/DiagnosticMessages
doivent être exclus d'une archive compressée du/private/var/log
répertoire.la source
Peut-être que vous pouvez essayer la commande avec une autre option:
Et vérifiez si cela fonctionne comme prévu.
la source
J'utilise un mac, et trouve que exclut ne fonctionnaient pas, sauf si le dossier de niveau supérieur est le dernier argument
exemple de commande de travail:
FYI:
la source
Dans mon cas, cela n’excluait pas pour une raison différente.
Le chemin complet vs chemin relatif.
L'exclusion et le répertoire doivent utiliser le même format de chemin (c'est-à-dire un chemin complet ou un chemin relatif).
Exemple:
Cela ne fonctionnera pas car exclut utilise un chemin complet, tandis que la cible utilise un chemin relatif.
Cela fonctionne parce que les deux utilisent le chemin complet
Cela fonctionne car les deux utilisent le chemin relatif
la source
Au lieu d'
--exclude=
utiliser-X
avec un fichier texte:http://www.cyberciti.biz/faq/exclude-certain-files-when-creating-a-tarball-using-tar-command/
la source
Notes complémentaires à l'excellente réponse de R Perrin :
Supposons que vous ne souhaitiez pas archiver des chemins absolus mais relatifs, par exemple, "data" au lieu de "/ tmp / data". Pour exclure les chemins absolus, vos arguments tar diffèrent en fonction de l'implémentation de tar (gnu tar vs. bsd tar) utilisée:
la source
Tout à l'heure détecté sur tar (GNU tar) 1.29
Cet appel n’exclut pas les fichiers d’archive spécifiés avec --exclude-from:
Cet appel fonctionne de manière coordonnée:
L'ordre des paramètres est important!
la source
J'ai essayé toutes sortes de combinaisons, y compris quelques unes des réponses répertoriées, mais je ne pouvais tout simplement pas l'exclure pour exclure les fichiers listés.
Alors, marre de chercher la réponse à ce qui devait être un travail de cinq minutes, j'ai fait le contraire: j'ai créé une archive des dossiers que je voulais inclure.
Je l'ai fait en créant une archive, puis en y ajoutant :
Quelques notes:
tar
(et non compressée tar.tgz
/.tar.gz
) - vous pouvez la compresser ultérieurement à l'aide degzip mybackup.tar
tar tvf mybackup.tar
.la source