Rechercher des fichiers sous Linux et exclure des répertoires spécifiques

14

J'ai une trouvaille ressemblant à ceci:

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

Je voudrais ajouter pour exclure un répertoire appelé "test" dans la recherche, mais je n'arrive pas à comprendre comment ajouter "-type d" d'une manière ou d'une autre. Comment ai-je fait ça?

Merci!

Asken
la source

Réponses:

22

Vous pouvez utiliser l' -pathoption pour le trouver et le combiner avec l' -notopérateur.

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

Veuillez noter deux choses

  • -path doit venir comme premier argument
  • le motif correspond au nom de fichier entier, donc -path testne correspondra à rien, jamais

Soit dit en passant, je ne sais pas pourquoi vous utilisez des parenthèses, cela ne fait aucune différence. Il n'est utilisé que pour la priorité, pour les constructions telles que ! \( -name '*bla*' -name '*foo*' \)(c'est-à-dire, ne trouve pas les choses qui ont les deux blaet 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 find.

janvier
la source
2
find / -path ./test -prune -o ...

Renommez-le ./testen fonction de l'emplacement de votre répertoire de test.

Charles Clavadetscher
la source
2
Dans ce cas, n'oubliez pas d'ajouter l'action -print (car -print n'est pas l'action par défaut) après l'option -o
Bill Zhao
1

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 renvoie 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 que tous les dossiers portent 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,

Antoine Rodriguez
la source
1

Pour développer ce que je pense @CharlesClavadetscherallait avec sa réponse. Si vous omettez un chemin avec -not -path ... find, continuez à descendre le chemin. Au lieu de cela, l'utilisation -prunel'empêchera de descendre plus loin 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

la source
0

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

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