Para el registro, aquí está el enfoque que prefiero:
grep pattern $(find . -type f ! -path './test/main.cpp')
Al mantener el grepprincipio del comando, creo que esto es un poco más claro, además no deshabilita grepel resaltado de color. En cierto sentido, usar finduna sustitución de comandos es solo una forma de extender / reemplazar el subconjunto (limitado) de búsqueda de archivos de grepla funcionalidad de.
Para mí, la find -execsintaxis es algo arcana. Una complejidad con find -execes la (a veces) necesidad de escapar de varios caracteres (especialmente si \;se usa en Bash). Solo para poner las cosas en contextos familiares, los siguientes dos comandos son básicamente equivalentes:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Si desea excluir subdirectorios , puede ser necesario usar un comodín. No entiendo completamente el esquema aquí, habla sobre lo arcano :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Una nota más para generalizar findsoluciones basadas en el uso en scripts : grepla línea de comandos debe incluir la opción -H/ --with-filename. De lo contrario, cambiará el formato de salida bajo la circunstancia de que solo haya un nombre de archivo en los resultados de búsqueda find. Esto es notable porque no parece ser necesario si se usa grepla búsqueda de archivos nativa (con la -ropción).
... Aún mejor, sin embargo, es incluir /dev/nullcomo primer archivo para buscar. Esto resuelve dos problemas:
- Asegura que si hay un archivo para buscar,
greppensará que hay dos y usará el modo de salida de múltiples archivos.
- Asegura que si no hay archivos para buscar,
greppensará que hay un archivo y no se quedará esperando en stdin.
Entonces la respuesta final es:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir). Es por eso que me gustaría hacer que grep realice la exclusión de forma nativa.