주어진 텍스트가 포함 된 파일 찾기


153

bash .php|.html|.js에서 대소 문자를 구분하지 않는 문자열을 포함하는 모든 유형의 파일에 대해 파일 이름 및 파일 경로를 반환하려고 합니다."document.cookie" | "setcookie"

어떻게해야합니까?


4
grep 사용을 고려 했습니까? cyberciti.biz/faq/grep-in-bash
Terrance

이 제목은 오해의 소지가 있습니다. "파일 찾기 포함 된 텍스트 찾기"
Josh C

답변:


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

r플래그 (하위 디렉토리를 검색) 재귀 적으로 검색하는 것을 의미합니다. i플래그 케이스를 구분을 의미한다.

파일 이름 만 원하면 l(소문자 L) 플래그를 추가하십시오 .

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

그것은 나를 위해 작동하지 않는 것 같습니다 (적어도 Mac에서는 아닙니다) .... 멈춤 ... egrep -lir --include = * "repo"egrep : 경고 : stdin의 재귀 적 검색
Dean Hiller

13
검색 경로를 추가하는 것을 잊었습니다. 경로는 '.'입니다. 위의 예에서. 귀하의 경우 스크립트는 stdin에서 입력이 검색되기를 기다리고 있습니다. 다음을 시도해보십시오 : egrep -lir --include = * "repo"/ (또는 다른 경로)
LodeRunner

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

grep: (error|fail): No such file or directoryUbuntu Desktop 16에서 오류가 발생 했습니다. 힌트가 있습니까?
Nam G VU

이 작업을 수행하려면 \로 *를 건너 뛰어야했습니다. 그래서--include=\*.{php,html,js}
Mehrad Mahmoudian

53

같은 것을 시도하십시오 grep -r -n -i --include="*.html *.php *.js" searchstrinhere .

-i그 사례 insensitlve한다

.당신이 당신의 현재 디렉토리에서 시작하려는 마지막 수단으로, 이것은 임의의 디렉토리로 대체 될 수있다.

-r방법은 디렉토리 트리 바로 아래에서 재귀 적으로 수행합니다.

-n경기의 줄 번호를 출력합니다.

--include당신이 확장 파일 이름을 추가 할 수 있습니다. 와일드 카드 허용

자세한 내용은 다음을 참조 하십시오 : http://www.gnu.org/software/grep/


4
아니면 사용 -l대신에 (단지 일치하는 파일 이름을 인쇄) 옵션을-n
글렌 잭맨

15

find그들과 grep문자열 :

이것은 / starting / path에서 3 가지 유형의 모든 파일을 찾고 정규 표현식에 대해 grep을 찾습니다 '(document\.cookie|setcookie)'. 가독성을 위해 백 슬래시를 사용하여 2 줄로 분할하십시오.

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

1
찾기를 보편적으로 사용하는 것과 비슷하지만 사용하는 것이 더 좋습니다-exec grep -l 'sth' {} \;
NGix

감사합니다 @Michael Berkowski이 방법 # egrep -ir --include=file.foo "(foo|bar)" /dir은 ~ 500Gb weigth 디렉토리에서 5 ~ 8 배 이상 빠릅니다 .
Qh0stM4N

9

완벽한 직업 grep또는 아마 ack 같은 소리

또는이 멋진 구성 :

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

+1 사용하는 -exec grep...것이 xargs파일 이름의 공백을 질식시키지 않기 때문에 내 방법 보다 낫습니다 .
Michael Berkowski

@MichaelBerkowski : 다음과 같이 파일 이름에서 공백을 처리 할 수 ​​있습니다 find . -type f -print0 | xargs -0 -I {} grep "search_string" {}. 물론 다른 옵션도 추가 할 수 있습니다.
파스칼

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

3

하나 이상의 대안을 포함시키기 위해 다음을 사용할 수도 있습니다.

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

어디:

  • -regextype posix-extendedfind어떤 종류의 정규 표현식을 기대하는지 알려줍니다.
  • -regex "^.*\.(php|html|js)$"find정규 표현식 자체에 파일 이름이 일치해야 함을 알려줍니다 .
  • -exec grep -EH '(document\.cookie|setcookie)' {} \;옵션과 찾은 각 파일에 대해 옵션 find사이에 지정된 명령 (옵션 및 인수와 함께)을 실행하도록 지시 합니다 .-exec\;{}

    동안

    • E옵션은 grep확장 정규 표현식을 사용하도록 지시 합니다 (괄호를 지원하기 위해) ...
    • H옵션은 grep일치하기 전에 파일 경로를 인쇄하도록 지시 합니다.

그리고 이것이 주어지면 파일 경로 만 원한다면 다음을 사용할 수 있습니다.

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

어디

  • |[pipe] find다음에 다음 명령으로 출력을 보냅니다 (즉 sed, sort)
  • r옵션은 sed확장 정규식을 사용하도록 지시 합니다.
  • s/HI/BYE/지시 sed"BYE"와 함께 "HI"의 (라인마다)마다 처음 나타나는 대체 ...
  • s/(^.*):.*$/\1/정규식을 대체하도록 지시 (^.*):.*$의미 ( 그룹 [둘러싸인 물건 ()포함] 모든 [ .*더 어떤 문자의 = 하나] 라인의 시작을 [ ^]까지 '첫 번째': '다음에 무엇 까지' 의 끝 대체 된 정규식 $의 첫 번째 그룹 [ \1]으로 [ ]) .
  • u정렬하여 중복 항목을 제거하도록 지시합니다 ( sort -u선택 사항으로 사용).

... 가장 우아한 방법이 아닙니다. 내가 말했듯이, 내 의도는 가능성의 범위를 늘리는 것 (그리고 사용할 수있는 도구에 대한 자세한 설명을 제공하는 것)입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.