Per la cronaca, ecco l'approccio che preferisco:
grep pattern $(find . -type f ! -path './test/main.cpp')
Mantenendo grep
all'inizio del comando, penso che questo sia un po 'più chiaro, inoltre non disabilita grep
l'evidenziazione del colore. In un certo senso, l'uso find
in una sostituzione di comando è solo un modo di estendere / sostituire il sottoinsieme (limitato) di ricerca di file della grep
funzionalità di.
Per me, la find -exec
sintassi è 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 find
soluzioni basate su base per l'uso negli script : La grep
riga 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 grep
la ricerca file nativa (con l' -r
opzione).
... Ancora meglio, però, è includere /dev/null
come primo file da cercare. Questo risolve due problemi:
- Assicura che se c'è un file da cercare,
grep
penserà che ce ne sono due e utilizzerà la modalità di output a più file.
- Assicura che se non ci sono file da cercare,
grep
penserà 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.