Znajdź pliki zawierające podany tekst


153

W bash chcę zwrócić nazwę pliku (i ścieżkę do pliku) dla każdego typu pliku .php|.html|.jszawierającego ciąg znaków bez rozróżniania wielkości liter"document.cookie" | "setcookie"

Jak bym to zrobił?


4
Czy rozważałeś użycie grepa? cyberciti.biz/faq/grep-in-bash
Terrance

Ten tytuł jest dość mylący. „znajdź-pliki-zawierające-podany-tekst”
Josh C,

Odpowiedzi:


212
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .

rFlaga oznacza szukać rekurencyjnie (wyszukiwanie podkatalogów). iFlaga oznacza wielkość liter ma znaczenie.

Jeśli chcesz tylko nazwy plików, dodaj flagę l(małe litery L):

egrep -lir --include=*.{php,html,js} "(document.cookie|setcookie)" .

to wydawało się nie działać dla mnie (przynajmniej nie na Macu) .... po prostu się zawiesza ... egrep -lir --include = * "repo" egrep: ostrzeżenie: rekurencyjne wyszukiwanie stdin
Dean Hiller

13
Zapomniałeś dodać ścieżkę wyszukiwania. Ścieżka to „.” w powyższym przykładzie. W twoim przypadku skrypt czeka na wejście do wyszukiwania na stdin. Spróbuj: egrep -lir --include = * "repo" / (lub dowolna inna ścieżka)
LodeRunner

1
grep -E ... >egrep ...
Aman,

Wystąpił błąd grep: (error|fail): No such file or directoryna Ubuntu Desktop 16; jakieś wskazówki?
Nam G VU

Aby to działało, musiałem pominąć * z \. więc mam--include=\*.{php,html,js}
Mehrad Mahmoudian

53

Spróbuj czegoś takiego grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

to -isprawia, że ​​sprawa jest niewrażliwa

.za pomocą końcowych chcesz zacząć od aktualnego katalogu, to może być podstawiony dowolnym katalogu.

te -rśrodki to zrobić rekurencyjnie, aż drzewie katalogów

-ndrukuje numer wiersza dla meczów.

--includeumożliwia dodawanie nazw plików, rozszerzeń. Akceptowane są symbole wieloznaczne

Więcej informacji można znaleźć pod adresem : http://www.gnu.org/software/grep/


4
A może użyj -lopcji (po prostu wypisz nazwy plików, które pasują) zamiast-n
glenn jackman

15

findje i grepdla ciągu:

Spowoduje to znalezienie wszystkich plików Twojego 3 typów w / start / path i grep dla wyrażenia regularnego '(document\.cookie|setcookie)'. Podziel na 2 wiersze z ukośnikiem odwrotnym tylko dla czytelności ...

find /starting/path -type f -name "*.php" -o -name "*.html" -o -name "*.js" | \
 xargs egrep -i '(document\.cookie|setcookie)'

1
Jak uniwersalne użycie find, ale moim zdaniem lepiej użyć-exec grep -l 'sth' {} \;
NGix

Dzięki @Michael Berkowski W ten sposób najszybszy ponad 5 lub 8 razy # egrep -ir --include=file.foo "(foo|bar)" /dirna katalogu wagi ~ 500Gb.
Qh0stM4N

9

Brzmi jak idealny do pracy greplub może ack

Albo ta wspaniała konstrukcja:

find . -type f \( -name *.php -o -name *.html -o -name *.js \) -exec grep "document.cookie\|setcookie" /dev/null {} \;

+1 Używanie -exec grep...jest lepsze niż moja xargsmetoda, ponieważ nie dusi się spacjami w nazwach plików.
Michael Berkowski

@MichaelBerkowski: Można go używać tak, aby radzić sobie ze spacjami w nazwach plików: find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. Oczywiście można również dodać inne opcje.
Pascal

4
find . -type f -name '*php' -o -name '*js' -o -name '*html' |\
xargs grep -liE 'document\.cookie|setcookie'

3

Aby dołączyć jeszcze jedną alternatywę, możesz również użyć tego:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \;

Gdzie:

  • -regextype posix-extendedmówi findjakiego rodzaju regex się spodziewać
  • -regex "^.*\.(php|html|js)$"mówi, findże samo wyrażenie regularne nazwy plików muszą być zgodne
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;mówi, findaby uruchomić polecenie (z jego opcjami i argumentami) określone między -execopcją a \;dla każdego znalezionego pliku, gdzie {}oznacza, gdzie ścieżka pliku przechodzi w tym poleceniu.

    podczas

    • Eopcja mówi, grepaby użyć rozszerzonego wyrażenia regularnego (do obsługi nawiasów) i ...
    • HOpcja nakazuje grepwypisać ścieżki plików przed dopasowaniami.

Biorąc to pod uwagę, jeśli chcesz tylko ścieżki do plików, możesz użyć:

find "/starting/path" -type f -regextype posix-extended -regex "^.*\.(php|html|js)$" -exec grep -EH '(document\.cookie|setcookie)' {} \; | sed -r 's/(^.*):.*$/\1/' | sort -u

Gdzie

  • |[potok] wyślij wynik findpolecenia do następnego polecenia po tym (czyli sedwtedy sort)
  • ropcja mówi, sedaby użyć rozszerzonego wyrażenia regularnego.
  • s/HI/BYE/każe sedzamienić każde pierwsze wystąpienie (w wierszu) „HI” na „BYE” i ...
  • s/(^.*):.*$/\1/mówi mu, aby zastąpić wyrażenie regularne (^.*):.*$(co oznacza grupę [ element ujęty przez ()] obejmującą wszystko [ .*= jeden lub więcej dowolnego znaku] od początku wiersza [ ^] do „pierwszego”: „po czym następuje cokolwiek do„ końca line [ $]) przez pierwszą grupę [ \1] zastąpionego wyrażenia regularnego.
  • umówi sortowi, aby usunął zduplikowane wpisy (wybierz sort -ujako opcjonalne).

... DUŻO od najbardziej eleganckiego sposobu. Jak powiedziałem, moim zamiarem jest zwiększenie zakresu możliwości (a także przedstawienie pełniejszych wyjaśnień na temat niektórych narzędzi, których możesz użyć).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.