Per la cronaca, ecco l'approccio che preferisco:
grep pattern $(find . -type f ! -path './test/main.cpp')
Mantenendo grepall'inizio del comando, penso che questo sia un po 'più chiaro, inoltre non disabilita grepl'evidenziazione del colore. In un certo senso, l'uso findin una sostituzione di comando è solo un modo di estendere / sostituire il sottoinsieme (limitato) di ricerca di file della grepfunzionalità di.
Per me, la find -execsintassi è un po 'arcana. Una complessità find -execè la (a volte) necessità di sfuggire a vari personaggi (in particolare se \;usato sotto Bash). Solo allo scopo di mettere le cose in contesti familiari, i seguenti due comandi sono sostanzialmente equivalenti:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Se si desidera escludere le sottodirectory , potrebbe essere necessario utilizzare un carattere jolly. Non capisco completamente lo schema qui - parla di arcane :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Un'ulteriore nota per generalizzare le findsoluzioni basate su base per l'uso negli script : La grepriga di comando dovrebbe includere l' opzione -H/ --with-filename. Altrimenti cambierà la formattazione dell'output nel caso in cui ci sia un solo nome file nei risultati della ricerca find. Ciò è notevole perché non sembra essere necessario se si utilizza grepla ricerca file nativa (con l' -ropzione).
... Ancora meglio, però, è includere /dev/nullcome primo file da cercare. Questo risolve due problemi:
- Assicura che se c'è un file da cercare,
greppenserà che ce ne sono due e utilizzerà la modalità di output a più file.
- Assicura che se non ci sono file da cercare,
greppenserà che ci sia un file e non si bloccherà in attesa su stdin.
Quindi la risposta finale è:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir). Ecco perché vorrei che grep eseguisse l'esclusione in modo nativo.