Dla przypomnienia, oto podejście, które wolę:
grep pattern $(find . -type f ! -path './test/main.cpp')
Trzymając grepna początku polecenia, myślę, że jest to nieco bardziej wyraźne - a ponadto nie wyłącza greppodświetlania kolorów. W pewnym sensie użycie findw podstawianiu poleceń jest tylko sposobem na rozszerzenie / zastąpienie (ograniczonego) podzbioru grepfunkcji wyszukiwania plików .
Dla mnie find -execskładnia jest dość tajemnicza. Jedną ze złożoności find -execjest (czasem) potrzeba ucieczki przed różnymi postaciami (zwłaszcza jeśli \;jest używana pod Bash). Tylko w celu umieszczenia rzeczy w znanych kontekstach następujące dwa polecenia są w zasadzie równoważne:
find . ! -path ./test/main.cpp -type f -exec grep pattern {} +
find . ! -path ./test/main.cpp -type f -print0 |xargs -0 grep pattern
Jeśli chcesz wykluczyć podkatalogi , może być konieczne użycie znaku wieloznacznego. Nie do końca rozumiem tutaj schemat - mów o tajemniczych :
grep pattern $(find . -type f ! -path './test/main.cpp' ! -path './lib/*' )
Jeszcze jedna uwaga na temat uogólnień findopartych na rozwiązaniach do użycia w skryptach : grepWiersz poleceń powinien zawierać opcję -H/ --with-filename. W przeciwnym razie zmieni formatowanie wyjściowe pod warunkiem, że w wynikach wyszukiwania znajduje się tylko jedna nazwa pliku find. Jest to godne uwagi, ponieważ nie wydaje się konieczne, jeśli używasz grepnatywnego wyszukiwania plików (z -ropcją).
... Jeszcze lepiej jest dołączyć /dev/nulljako pierwszy plik do przeszukania. To rozwiązuje dwa problemy:
- Zapewnia, że jeśli jest jeden plik do przeszukania,
greppomyśli, że są dwa pliki i używa trybu wyjścia z wieloma plikami.
- Zapewnia, że jeśli nie ma plików do przeszukania,
greppomyśli, że jest jeden plik i nie zawiesi się, czekając na standardowe wejście.
Ostateczna odpowiedź to:
grep pattern /dev/null $(find . -type f ! -path './test/main.cpp')
--exclude-dir). Dlatego chciałbym, aby grep wykonał wykluczenie natywnie.