Jednym z moich ulubionych poleceń BASH jest:
find . -name '*.*' -exec grep 'SearchString' {} /dev/null \;
który przeszukuje zawartość wszystkich plików znajdujących się w bieżącym katalogu i poniżej pod kątem określonego SearchString. Jako programista czasami się przydał.
Ze względu na mój obecny projekt i strukturę bazy kodu chciałbym jednak uczynić to polecenie BASH jeszcze bardziej zaawansowanym, nie wyszukując żadnych plików, które znajdują się w lub poniżej katalogu zawierającego „.svn”, ani żadnych plików, które zakończ na „.html”
Jednak strona MAN dla wyszukiwania trochę mnie zdezorientowała. Próbowałem użyć -prune, co dało mi dziwne zachowanie. Próbując pominąć tylko strony .html (na początek), próbowałem:
find . -wholename './*.html' -prune -exec grep 'SearchString' {} /dev/null \;
i nie uzyskałem zachowania, na które liczyłem. Wydaje mi się, że brakuje mi punktu -pune. Czy moglibyście mi pomóc?
Dzięki
grep -rl 'SearchString'
find
do wyszukiwania w pliku.
-name '*.*'
nie znajduje wszystkich plików: tylko te z .
imieniem (użycie *.*
zwykle jest DOS-ism, podczas gdy w Uniksie zwykle używasz tylko *
do tego). Aby naprawdę dopasować je wszystkie, po prostu usunąć całkowicie argument: find . -exec ...
. Lub jeśli chcesz zastosować grep tylko do plików (i pominąć katalogi), to zrób find . -type f -exec ...
.
find
nie jest wbudowanym poleceniem bash, ale osobnym programem