Si -prune
ne fonctionne pas pour vous, ceci :
find -name "*.js" -not -path "./directory/*"
Mise en garde : nécessite de parcourir tous les répertoires indésirables.
Utilisez le -prune
primaire. Par exemple, si vous souhaitez exclure ./misc
:
find . -path ./misc -prune -o -name '*.txt' -print
Pour exclure plusieurs répertoires, OR entre parenthèses.
find . -type d \( -path ./dir1 -o -path ./dir2 -o -path ./dir3 \) -prune -o -name '*.txt' -print
Et, pour exclure les répertoires avec un nom spécifique à n'importe quel niveau, utilisez le -name
primaire au lieu de -path
.
find . -type d -name node_modules -prune -o -name '*.json' -print
Je trouve les solutions suivantes plus faciles à raisonner que les autres solutions proposées :
find build -not \( -path build/external -prune \) -name \*.js
# you can also exclude multiple paths
find build -not \( -path build/external -prune \) -not \( -path build/blog -prune \) -name \*.js
Remarque importante : les chemins que vous tapez après -path
doit correspondre exactement à ce find
serait imprimer sans l'exclusion. Si cette phrase vous confond, assurez-vous simplement d'utiliser des chemins complets à travers le tout commande comme celle-ci :find /full/path/ -not \( -path /full/path/exclude/this -prune \) ...
. Voir la note [1] si vous souhaitez une meilleure compréhension.
À l'intérieur de \(
et \)
est une expression qui correspondra exactement build/external
(voir la note importante ci-dessus) et, en cas de succès, évitera de traverser quoi que ce soit ci-dessous . Ceci est ensuite regroupé en une seule expression avec la parenthèse échappée et préfixé par -not
ce qui fera find
ignorez tout ce qui correspond à cette expression.
On pourrait se demander si l'ajout de -not
ne masquera pas tous les autres fichiers par -prune
réapparaître, et la réponse est non. Le chemin -prune
fonctionne est que tout ce qui, une fois qu'il est atteint, les fichiers sous ce répertoire sont définitivement ignorés.
Cela vient d'un cas d'utilisation réel, où j'avais besoin d'appeler yui-compressor sur certains fichiers générés par wintersmith, mais de laisser de côté les autres fichiers qui doivent être envoyés tels quels.
Remarque [1] :Si vous souhaitez exclure /tmp/foo/bar
et vous lancez find comme ceci "find /tmp \(...
" alors vous devez spécifier -path /tmp/foo/bar
. Si par contre vous exécutez find comme ceci cd /tmp; find . \(...
alors vous devez spécifier -path ./foo/bar
.