W bash chcę zwrócić nazwę pliku (i ścieżkę do pliku) dla każdego typu pliku .php|.html|.js
zawierającego ciąg znaków bez rozróżniania wielkości liter"document.cookie" | "setcookie"
Jak bym to zrobił?
W bash chcę zwrócić nazwę pliku (i ścieżkę do pliku) dla każdego typu pliku .php|.html|.js
zawierającego ciąg znaków bez rozróżniania wielkości liter"document.cookie" | "setcookie"
Jak bym to zrobił?
Odpowiedzi:
egrep -ir --include=*.{php,html,js} "(document.cookie|setcookie)" .
r
Flaga oznacza szukać rekurencyjnie (wyszukiwanie podkatalogów). i
Flaga 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)" .
grep -E ...
>egrep ...
grep: (error|fail): No such file or directory
na Ubuntu Desktop 16; jakieś wskazówki?
--include=\*.{php,html,js}
Spróbuj czegoś takiego grep -r -n -i --include="*.html *.php *.js" searchstrinhere .
to -i
sprawia, ż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
-n
drukuje numer wiersza dla meczów.
--include
umożliwia dodawanie nazw plików, rozszerzeń. Akceptowane są symbole wieloznaczne
Więcej informacji można znaleźć pod adresem : http://www.gnu.org/software/grep/
-l
opcji (po prostu wypisz nazwy plików, które pasują) zamiast-n
find
je i grep
dla 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)'
-exec grep -l 'sth' {} \;
# egrep -ir --include=file.foo "(foo|bar)" /dir
na katalogu wagi ~ 500Gb.
Brzmi jak idealny do pracy grep
lub 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 {} \;
-exec grep...
jest lepsze niż moja xargs
metoda, ponieważ nie dusi się spacjami w nazwach plików.
find . -type f -print0 | xargs -0 -I {} grep "search_string" {}
. Oczywiście można również dodać inne opcje.
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-extended
mówi find
jakiego 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, find
aby uruchomić polecenie (z jego opcjami i argumentami) określone między -exec
opcją a \;
dla każdego znalezionego pliku, gdzie {}
oznacza, gdzie ścieżka pliku przechodzi w tym poleceniu.
podczas
E
opcja mówi, grep
aby użyć rozszerzonego wyrażenia regularnego (do obsługi nawiasów) i ...H
Opcja nakazuje grep
wypisać ś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 find
polecenia do następnego polecenia po tym (czyli sed
wtedy sort
)r
opcja mówi, sed
aby użyć rozszerzonego wyrażenia regularnego.s/HI/BYE/
każe sed
zamienić 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.u
mówi sortowi, aby usunął zduplikowane wpisy (wybierz sort -u
jako 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ć).