18 votes

Trouver des fichiers dans linux et exclure des répertoires spécifiques

J'ai une trouvaille qui ressemble à ça :

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

J'aimerais ajouter l'exclusion d'un répertoire appelé "test" dans la recherche mais je n'arrive pas à trouver comment ajouter "-type d". Comment dois-je m'y prendre ?

Merci !

24voto

January Points 33673

Vous pouvez utiliser le -path pour le trouver et le combiner avec l'option -not opérateur.

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

Veuillez noter deux choses

  • -path doit être le premier argument
  • le modèle correspond à l'ensemble du nom de fichier, donc -path test ne correspondra à rien, jamais

Au fait, je ne sais pas pourquoi vous utilisez des parenthèses, cela ne fait aucune différence. Elles ne sont utilisées que pour la préséance, pour des constructions telles que ! \( -name '*bla*' -name '*foo*' \) (c'est-à-dire qu'il ne faut pas trouver des choses qui ont à la fois bla y foo ).

Un raffinement supplémentaire : pas besoin d'utiliser la boucle bash, vous pouvez simplement faire

find . ... -exec cat {} \; -exec echo \;

où ... sont les autres arguments de find .

3voto

find / -path ./test -prune -o ...

Renommer ./test pour s'adapter à l'emplacement de votre répertoire de test.

2voto

Pour développer ce que je pense @CharlesClavadetscher allait avec sa réponse. Si vous omettez un chemin avec -not -path ... find va continuer à descendre le chemin. Au lieu de cela, en utilisant -prune l'empêchera de descendre plus bas dans le chemin omis, ce qui le rendra plus rapide. Vous pouvez donc faire quelque chose comme

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

1voto

Amy Points 8019

Vous pouvez essayer avec grep comme ceci (le dossier ici est nommé test_folder) :

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

ou si votre recherche retourne un chemin relatif :

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

ou si vous voulez tous les dossiers qui ont le même nom mais avec un chemin différent

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

Meilleures salutations,

0voto

arrietty7 Points 21

J'utilise "not wholename" lorsque je cherche simplement un fichier. -name teste le nom de fichier réel, mais -wholename teste le chemin complet. J'ajoute donc un test "ignorer pour" à la question ci-dessus :

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X