Dla przypomnienia, oto podejście, które wolę:
grep pattern $(find . -type f ! -path './test/main.cpp')
Trzymając grep
na początku polecenia, myślę, że jest to nieco bardziej wyraźne - a ponadto nie wyłącza grep
podświetlania kolorów. W pewnym sensie użycie find
w podstawianiu poleceń jest tylko sposobem na rozszerzenie / zastąpienie (ograniczonego) podzbioru grep
funkcji wyszukiwania plików .
Dla mnie find -exec
składnia jest dość tajemnicza. Jedną ze złożoności find -exec
jest (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ń find
opartych na rozwiązaniach do użycia w skryptach : grep
Wiersz 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 grep
natywnego wyszukiwania plików (z -r
opcją).
... Jeszcze lepiej jest dołączyć /dev/null
jako pierwszy plik do przeszukania. To rozwiązuje dwa problemy:
- Zapewnia, że jeśli jest jeden plik do przeszukania,
grep
pomyśli, że są dwa pliki i używa trybu wyjścia z wieloma plikami.
- Zapewnia, że jeśli nie ma plików do przeszukania,
grep
pomyś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.