Pour mémoire, voici l'approche que je préfère:
grep pattern $(find . -type f ! -path './test/main.cpp')
En gardant le grep
au début de la commande, je pense que c'est un peu plus clair - en plus cela ne désactive pas grep
la surbrillance des couleurs. Dans un sens, l'utilisation find
dans une substitution de commande n'est qu'un moyen d'étendre / remplacer le sous-ensemble (limité) de recherche de fichiers de grep
la fonctionnalité de.
Pour moi, la find -exec
syntaxe est un peu mystérieuse. Une complexité avec find -exec
est 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 find
solutions basées sur l'utilisation dans les scripts : La grep
ligne 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 grep
la recherche de fichiers native de (avec l' -r
option).
... Encore mieux, cependant, est d'inclure /dev/null
comme premier fichier à rechercher. Cela résout deux problèmes:
- Il garantit que s'il y a un fichier à rechercher,
grep
pense 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,
grep
pensera 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.