Pour mémoire, voici l'approche que je préfère:
grep pattern $(find . -type f ! -path './test/main.cpp')
En gardant le grepau début de la commande, je pense que c'est un peu plus clair - en plus cela ne désactive pas grepla surbrillance des couleurs. Dans un sens, l'utilisation finddans une substitution de commande n'est qu'un moyen d'étendre / remplacer le sous-ensemble (limité) de recherche de fichiers de grepla fonctionnalité de.
Pour moi, la find -execsyntaxe est un peu mystérieuse. Une complexité avec find -execest le besoin (parfois) d'échapper à divers caractères (notamment si \;est utilisé sous Bash). Juste pour mettre des choses dans des contextes familiers, les deux commandes suivantes sont fondamentalement équivalentes:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Si vous souhaitez exclure des sous - répertoires , il peut être nécessaire d'utiliser un caractère générique. Je ne comprends pas complètement le schéma ici - parlez des arcanes :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Une autre note pour généraliser les findsolutions basées sur l'utilisation dans les scripts : La grepligne de commande doit inclure l' option -H/ --with-filename. Sinon, cela modifiera la mise en forme de la sortie dans le cas où il se trouve qu'il n'y a qu'un seul nom de fichier dans les résultats de la recherche find. Ceci est remarquable car il ne semble pas nécessaire si vous utilisez grepla recherche de fichiers native de (avec l' -roption).
... Encore mieux, cependant, est d'inclure /dev/nullcomme premier fichier à rechercher. Cela résout deux problèmes:
- Il garantit que s'il y a un fichier à rechercher,
greppense qu'il y en a deux et utilise le mode de sortie à fichiers multiples.
- Il garantit que s'il n'y a pas de fichiers à rechercher,
greppensera qu'il y a un fichier et ne se bloque pas en attente sur stdin.
La réponse finale est donc:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir). C'est pourquoi je voudrais que grep effectue nativement l'exclusion.