Trouvez des fichiers dans Linux et excluez des répertoires spécifiques

12

J'ai une trouvaille qui ressemble à 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 est-ce que je vais faire ça?

Merci!

    
posée Asken 25.10.2012 - 15:57
la source

5 réponses

18

Vous pouvez utiliser l’option -path pour rechercher et combiner l’opérateur -not .

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'intégralité 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. Il n'est utilisé que pour la priorité, pour les constructions telles que ! \( -name '*bla*' -name '*foo*' \) (c'est-à-dire que les objets contenant bla et foo ) ne sont pas détectés.

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

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

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

    
réponse donnée January 25.10.2012 - 16:37
la source
3
find / -path ./test -prune -o ...

Renommez ./test en fonction de l’emplacement de votre répertoire de test.

    
réponse donnée Charles Clavadetscher 27.01.2014 - 08:10
la source
1

Vous pouvez essayer avec grep comme ceci (le dossier ici s'appelle 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 tous les dossiers portant 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

Cordialement,

    
réponse donnée Antoine Rodriguez 25.10.2012 - 16:02
la source
1

Pour développer ce que je pense que @CharlesClavadetscher allait faire avec sa réponse. Si vous omettez un chemin avec -not -path ... find continuera à descendre le chemin. Au lieu de cela, utiliser -prune l'empêchera de descendre plus loin dans le chemin omis, le rendant plus rapide. Donc, vous pouvez faire quelque chose comme

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print
    
réponse donnée BroSlow 28.06.2014 - 06:48
la source
0

J'utilise "not wholename" quand je cherche simplement un fichier. -name teste le nom de fichier réel, mais -wholename teste le chemin complet. Donc, en ajoutant une ignorance pour tester la question ci-dessus:

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
    
réponse donnée andrew lorien 17.02.2016 - 01:50
la source

Lire d'autres questions sur les étiquettes