Jak połączyć find i grep w celu rekurencyjnego wyszukiwania plików str lub str2 w plikach * .html i * .php z / home / smith / sourcecode?

2

Jak mogę łączyć findi grepwyszukiwać str1lub str2rekurencyjnie we wszystkich plikach * .html i * .php, zaczynając od katalogu o nazwie / home / smith / source? Dane wyjściowe muszą tylko zawierać listę plików (ze ścieżką), a nie rzeczywisty dopasowany ciąg. wypróbowałem wiele odmian bez powodzenia. Istnieje wiele przykładów tego, jak to zrobić dla jednego wzorca pliku lub jednego ciągu, ale nie dla wielu wzorów plików i wielu ciągów - rekurencyjnie .


źródło

Odpowiedzi:

4

Inne są poprawne, ale z dostępną nowoczesną wersją grep są moim zdaniem przesadne. Poniższe będzie rekurencyjnie skanować tylko pliki z rozszerzeniami .html lub .php i zwróci nazwę pliku ze ścieżką każdego pliku z co najmniej jedną linią pasującą do str1 lub str2. Zauważ, że powtarzane -eopcje pozwalają na określenie wielu ścieżek bez użycia w tym celu składni wyrażenia regularnego.

grep -r --files-with-mecze --include ' .html' --include ' .php' -e str1 -e str2 / home / smith / source

Jedno narzędzie, jeden proces, bez dodatkowego rozwidlania lub skanowania nieistotnych plików. Wymaga tylko stosunkowo nowej wersji gnu grep dla opcji --include, w przeciwnym razie będziesz musiał wykonać wieloetapowy grep, jak proponują inni.

Tom Scogland
źródło
3
egrep 'string1|string2' /home/smith/source/*.{html,php}

lub szukanie rekursywnie dowolnego typu pliku w katalogu,

egrep -R 'string1|string2' /home/smith/source

możesz to połączyć z innym egrep w rurze:

egrep -R 'string1|string2' /home/smith/source | egrep '.html|.php'
iamauser
źródło
1

Użyj egrepi użyj | aby określić str1 lub str2-:

find /home/smith/source -name \*.html -o -name \*.php -exec egrep -H 'str1|str2' {} \;
podejrzenie
źródło
Pokazuje pasujący tekst, a nie nazwy plików, ale jest w porządku (zaktualizowałem pytania prawdopodobnie podczas odpowiedzi na istniejące). Jak mogę to uogólnić, jeśli chcę wyszukać wzorce plików 3,4,5 lub n?
-H opcja egrep, a następnie wypisuje ścieżki plików. str1 | str2 | str3..etc działałoby - czy to rozumiesz przez uogólnienie?
podejrzany
Tak, ale chciałem również uogólnić wzorzec pliku (np. * .Php i * .html oraz * .txt i ...). Wydaje się, że tak się dzieje:find /home/smiths/source -type f -regextype posix-egrep -regex ".*\.(php|html)$" -exec egrep -H -n "str1|str2|str3" '{}' \;
1

Jeśli używasz ack(patrz http://beyondgrep.com ), możesz to zrobić:

ack --php --html -l 'str1|str2' /home/smith/source
Andy Lester
źródło
Reimplementowane również jako ag i rg . Co, jak sądzę, jest świadectwem jego braku szczęścia .
user2394284,
Reimplemented by szereg różnych narzędzi, z których wiele jest wymienionych tutaj: beyondgrep.com/more-tools
Andy Lester,
0

Nie zapominaj, że twoja powłoka jest o wiele wygodniejsza niż findgdybyś tylko szukał plików według nazwy!

Grzmotnąć:

shopt -s nullglob globstar
grep -lE 'str1|str2' /home/smith/source/**/*.{html,php}

Ryba:

grep -lE 'str1|str2' /home/smith/source/**.{html,php}
użytkownik2394284
źródło