“grep”명령을 사용하여 하위 디렉토리를 포함한 텍스트를 찾는 방법


373

특정 텍스트 문자열을 포함하는 모든 파일을 찾고 싶습니다. grep명령은 작동하지만, 나는 (내가 현재 디렉토리 위해 그것을 할 경우에만 가능) 모든 디렉토리를 사용하는 방법을 모르겠어요. 나는 독서를 시도했지만 man grep아무런 도움이되지 않았다.


grep -RIn <yor pattern> * 모든 텍스트 파일에서 현재 디렉토리를 검색합니다. grep 만 사용하는 * .C와 같은 파일 패턴에서 재귀 적으로 검색을 수행하는 방법을

1
--include="*.C"@Lekensteyn 덕분에 옵션 @ user311346이 포함 된 와일드 카드 .
Bob Stein

find 및 grep 조합을 사용하여 현재 및 모든 서브 디렉토리에서 문자열을 재귀 적으로 검색하십시오. 이 wilddiary.com/find-files-include-my-text를
Drona

답변:


487

사용하는 것이 좋습니다

grep -rl "string" /path

어디

  • -r(또는 --recursive) 옵션은 모든 하위 디렉토리를 탐색하는 데 사용되는 /path반면,
  • -l(또는 --files-with-matches) 옵션은 일치하는 줄이 아닌 일치하는 파일의 파일 이름 만 인쇄하는 데 사용됩니다 ( grep이 옵션과 처음 일치 할 때 파일 읽기 를 중지 하면 속도가 향상 될 수도 있습니다).

13
실제로 "문자열"이 찾기위한 텍스트 패턴 인 경우 해당 기능을 사용하는 것이 좋습니다. 그렇지 않으면 문자열에 점으로 표시되는 점뿐만 아니라 정규 표현식에서 의미가있는 점 또는 특수 문자가 문자열에 포함되어 있으면 누군가 문제에 직면 할 수 있습니다. , 그대로. 그런 다음 "고정 문자열"(예를 들어 regexp가 아닌)에 -rlF스위치를 사용 합니다 -F. 물론 작업이 정규 표현식을 사용하는 경우 실례합니다. 물론, -r이없는 동일한 이론은 사람들이 grep 검색을 "텍스트"라고 가정하고 정규 표현식과 같은 것을 의미하는 특수한 문제를 일으킬 수 있다는 것을 종종 알 수 있습니다.
LGB

4
-i대소 문자를 무시 하는 플래그 도 있습니다 .
Marco Ceppi

3
나는 단지 --recursive옵션 을 보여주고 싶습니다. 많은 옵션과 사용 시나리오가 있습니다. 나는 @dmityugov에서 받아 들여진 대답에서 시작하여없이 일하도록 수정되었습니다 find.
enzotib

1
@NN : done :-)
enzotib

3
@ScottBiggs : 옵션 사용--include '*.h'
enzotib

167

파일에서 일치하는 줄을 찾고 있다면 내가 가장 좋아하는 명령은 다음과 같습니다.

grep -Hrn 'search term' path/to/files
  • -H 파일 이름이 인쇄되도록합니다 (여러 파일을 검색 할 때 포함됨)
  • -r 재귀 적 검색을한다
  • -n 줄 번호가 인쇄됩니다

path/to/files.현재 디렉토리에서 검색 할 수 있습니다

매우 유용한 추가 옵션 :

  • -I이진 파일 무시 (보완 : -a모든 파일을 텍스트로 처리)
  • -Fsearch term정규식이 아닌 리터럴로 취급
  • -i 대소 문자를 구분하지 않는 검색을 수행
  • --color=always배관 할 때에도 색상을 강제로 적용합니다 less. less지원 색상 을 만들려면 다음 -r옵션 을 사용해야합니다 .

    grep -Hrn search . | less -r
    
  • --exclude-dir=dir.svnand 같은 디렉토리를 제외하는 데 유용합니다 .git.

출력 예


13
-H가능한 한 하나 이상의 파일이 있으면 폴더에서 중복됩니다. 사실, 사람이 페이지는 말한다-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
enzotib

나는 그것이 항상 예상대로 작동한다는 것을 몰랐습니다. 파일을 찾을 때 기본 명령입니다.
Lekensteyn

1
확장자가 .a 인 파일 만 고려하는 방법이 있습니까 (그리고 이것을 -r과 결합)?
user2413

6
@ user2413의 시도--include '*.*'
Lekensteyn

1
@alper trygrep --exclude='*~' ...
Lekensteyn

24

나는 당신이 다음과 같은 것을 사용할 수 있다고 생각합니다 :

find /path -type f -exec grep -l "string" {} \;

의견 설명

find주어진 경로의 서브 디렉토리에서 디렉토리 및 링크와 같은 파일 및 기타 오브젝트를 찾을 수있는 명령입니다. 파일 이름이 충족해야하는 마스크를 지정하지 않으면 모든 디렉토리 객체가 열거됩니다.

  • -type f 디렉토리 등이 아닌 파일 만 처리하도록 지정합니다.
  • -exec grep모든 발견 파일, 그것은 대체하여, 그것의 인수로 자사의 파일 이름을 전달위한 grep 명령을 실행하도록 지정 {}파일 이름으로

3
모르는 사람들을 위해 추가하면 -name '*.py''.py'로 끝나는 파일로 일치가 제한됩니다.
Daniel F

grep 명령에 -R을 구현하지 않은 클라이언트에 적용됩니다.
Aviose

일치하는 줄과 파일 이름을 인쇄하려면 exec를 다음과 같이 만드십시오.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Donn Lee

grep을 직접 사용하는 상대적인 성능은 무엇입니까?
조나단

19

내 기본 명령은

grep -Rin string *

ls재귀에 사용하기 때문에 국회 의사당 'R'을 사용합니다. grep이 두 가지를 모두 허용하므로 사용하지 않을 이유가 없습니다.

편집 : HVNSweeting 당, 분명히 그렇지 않은 -R경우 심볼릭 링크를 따릅니다 -r.


1
숨겨진 파일도 검색하려면 "set"을 shopt -s dotglob기억하십시오 -s. 그런 다음 파일을 제거 할 때주의하십시오. 당신이 dotglob 설정 한 경우, rm -r *현재 디렉토리에있는 모든 것을 제거하지만 또한 디렉토리 위에 있기 때문에 ..일치. dotglob를 비활성화하려면 shopt -u dotglob( "unset")을 사용하십시오. 변경 사항은 일시적이지만 현재 셸에만 적용됩니다.
Lekensteyn

나는 이것을 잊었다. 한 줄로 설정하는 방법이 있습니까? shopt -s dotglob & <grep cmd> & shopt -y dotglob더 편리한 것 같은 것 ? 이렇게하면 재설정에 대해 걱정할 필요가 없습니다
user606723

또한 grep -Rin string .대부분의 경우 에 사용하기가 더 쉽습니다 . 나는 더 자연스럽게 오는 것처럼 보이기 때문에 *를 사용합니다.
user606723

1
재귀 grep을 수행하면 "."부터 시작할 수 있습니다. 대신에 "*". 도트 글롭이 필요하지 않습니다.
Michał Šrajer

1
맨 투표에서 언급하지 않은 한 가지는 R상징적 인 링크를 따르고 r그렇지 않다는 것입니다
HVNSweeting

12

새로운 것을 기꺼이 시도하고 싶다면 ack촬영하십시오. 현재 디렉토리를 재귀 적으로 검색하는 명령 string은 다음과 같습니다.

ack string

설치는 매우 간단합니다.

curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3

(이미 디렉토리를 가지고 있으며 ~/bin바람직하게 는 디렉토리 에 있습니다 PATH.)


2
또는 apt-get install ack-grep (및 .bashrc에 별명 ack = ack-grep 추가)
markijbema

chmod명령 의 마지막 매개 변수는 무엇을합니까 ? 그것들은 특정 적이 chmod거나 배쉬와 관련이 !#:3있습니까 ( 부분)?
Elliott Darfink

즉, 배쉬의 사용이다 @ElliottDarfink 기록 기능을 - !입니다 이벤트 지정자 . 그들은 반복을 피하기 위해 매우 강력합니다. !#:3지금까지 명령 줄의 세 번째 토큰을 참조합니다 ( ~/bin/ack이 경우).
Konrad Rudolph

4

rgrep 명령은 그러한 요구에 전념합니다

사용할 수없는 경우 다음과 같이 얻을 수 있습니다

mkdir -p ~/bin
cd ~/bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod +x rgrep

위에서 설명한대로 기본 grep 옵션을 직접 설정할 수 있습니다.

나는 개인적으로 사용

[[  ${#args} -lt 5 && "${args//[[:space:]]/}" == "-i" ]] && args="-Hin"
args="${args:--Hns} --color=auto"

관련 주제 : 항상 rgrep을 색상과 함께 사용하는 방법


rgrep은 기본적으로 우분투에 설치된 grep 패키지에 의해 제공됩니다.
karel

2

업데이트 2 :

이 명령 줄은 문제를 사용 find하고 grep수정합니다.

$ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev/null +

--color=<always or auto> 컬러 출력의 경우 :

$ find path_to_search_in -type f \
            -exec grep --color=always -in searchString {} 2>/dev/null +

예:

$ find /tmp/test/ -type f -exec grep --color=auto -in "Search string" {} 2>/dev/null +

아래 스냅 샷에서 예제를 실행하십시오. snap1


업데이트 1 :

다음 코드를 시도해 볼 수 있습니다. 귀하 .bashrc또는 .bash_aliases스크립트에서 함수로 :

wherein () 
{ 
    for i in $(find "$1" -type f 2> /dev/null);
    do
        if grep --color=auto -i "$2" "$i" 2> /dev/null; then
            echo -e "\033[0;32mFound in: $i \033[0m\n";
        fi;
    done
}

용법: wherein /path/to/search/in/ searchkeyword

예:

$ wherein ~/Documents/ "hello world"

(참고 : @enzotib의 아래 주석에서 제안한 것처럼 이름에 공백을 포함하여 파일 / 디렉토리에서는 작동하지 않습니다.)


원본 게시물

문자열을 검색하고 검색 문자열을 사용하여 해당 행만 출력하려면 다음을 수행하십시오.

$ for i in $(find /path/of/target/directory -type f); do \
    grep -i "the string to look for" "$i"; done

예 :

$ for i in $(find /usr/share/applications -type f); \
    do grep -i "web browser" "$i"; done

검색 문자열이 포함 된 파일 이름을 표시하려면

$ for i in $(find /path/of/target/directory -type f); do \
    if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

예 :

$ for i in $(find /usr/share/applications -type f); \
    do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
    fi; done;

공백이 포함 된 파일 이름이 실패합니다. 실패는 stderr이 표시되지 않는다는 사실에 의해 숨겨집니다.
enzotib 2018 년

@enzotib 지적 해 주셔서 감사합니다. 그것은 여전히 ​​지정된 함수에 대해 해결되지 않았습니다. 나는 다른 하나의 라이너를 추가했습니다 ..
정확한

이제 답은 @dmityugov와 비슷합니다.
enzotib

네,하지만 그런 의미에서이 페이지에서 답변의 대부분은 당신이 그들이 사용하는 점에서 비슷 확인할 경우 grep사용하여 다음에 해당되는 부분 집합에, find함께 grep...하지만 당신은 독특한 답변으로 다른 스위치와 비틀기를 받아 들일 경우, 아마 내 것도 여기에 맞을 것이다. 마지막 업데이트는 검색에서 원하는 것을 수행합니다 : 검색 키가있는 줄과 줄 번호가있는 파일 이름. 너무 :) 더 나은 가독성을 위해 출력 및 오류 필터를 색 ..
정확한

2

grep( GNU 또는 BSD )

다음 과 같이 grep도구를 사용 하여 -r매개 변수 를 사용 하여 현재 폴더를 재귀 적으로 검색 할 수 있습니다 .

grep -r "pattern" .

참고 : -r-하위 디렉토리를 재귀 적으로 검색합니다.

특정 파일 내에서 검색하려면 다음과 같은 글 로빙 구문을 사용할 수 있습니다 .

grep "class foo" **/*.c

참고 : 글 로빙 옵션 ( **) 을 사용 하면 특정 확장자 또는 패턴으로 모든 파일을 재귀 적으로 검색합니다. 이 구문을 사용하려면 다음을 실행하십시오 shopt -s globstar.. **/*.*모든 파일 (숨김 및 확장명 제외) 또는 다른 패턴 에도 사용할 수 있습니다 .

인수가 너무 길다는 오류가 발생하면 검색 범위를 좁히거나 다음 find과 같은 구문을 사용하십시오.

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

또는을 사용하십시오 ripgrep.

ripgrep

더 큰 프로젝트 나 큰 파일을 작업하는 경우 다음 ripgrep과 같이 대신 사용해야 합니다.

rg "pattern" .

GitHub 프로젝트 페이지 에서 문서, 설치 단계 또는 소스 코드를 확인 하십시오 .

이 같은 다른 도구보다 훨씬 빠릅니다 GNU / BSD grep , ucg, ag, sift, ack, pt이 위에 구축되어 있기 때문에, 또는 유사한 녹의 정규식 엔진이 매우 빠르게 검색 할 수 있도록, SIMD 공격적인 문자 최적화를 유한 오토마타를 사용합니다.

.gitignore파일에 지정된 패턴 무시를 지원 하므로 단일 파일 경로를 여러 glob 패턴과 동시에 일치시킬 수 있습니다.


다음과 같은 일반적인 매개 변수를 사용할 수 있습니다.

  • -i -민감한 검색.
  • -I -이진 파일을 무시하십시오.
  • -w -전체 단어를 검색합니다 (일부 단어 일치와 반대).
  • -n -당신의 경기 라인을 보여줍니다.
  • -C/ --context(예 -C5)-컨텍스트를 증가시켜 주변 코드를 볼 수 있습니다.
  • --color=auto -일치하는 텍스트를 표시하십시오.
  • -H -텍스트가있는 파일 이름을 표시합니다.
  • -c-일치하는 줄 수를 표시합니다. 와 결합 할 수 있습니다 -H.

1

나는 매우 과소 평가 된 명령 인 xargs를 사용 하여이 작업을 수행합니다.

find ./ -type f -print0 | xargs -0 grep 'string_you_are_looking_for'

find ./는 현재 폴더에있는 모든 파일의 재귀 목록을 제공 한 다음 xargs로 파이프하여 해당 파일 각각에 대해 grep 명령을 실행합니다.


4
사용 xargs하지 않고 -print0에 대한 옵션 find-0옵션의 정보는 다음의 제품에 xargs사용되지 않습니다, 그것은 공백이 포함 된 파일 이름에 실패합니다.
enzotib

@enzotib 제안한대로 답변을 편집했습니다 .- 검토하고 수정하고 수정해야 할 경우 기꺼이 다시 수정하겠습니다. 감사합니다
αғsнιη

1
@ KasiyA : 이제 괜찮습니다. 내 downvote를 제거했습니다.
enzotib 2012 년

0

여기에 많은 답변이 있지만 파일을 검색 할 때 다른 제한 사항을 추가하려는 경우 대안이 있습니다.

find . -type f -exec grep --quiet string_to_look_for {} ';' -print

grep결과가 발견되면 0을 반환하고 그렇지 않으면 1을 반환 하기 때문에 작동합니다 . 예를 들어, 당신은 1메가바이트 큰 파일을 찾을 수 포함 뭔가를 :

find . -type f -exec grep --quiet string_to_look_for {} ';' -size 1M -print

여러 요구 사항의 경우 -OGNU grep에 존재 하는 최적화 프로그램 플래그를 사용하고 싶을 것입니다 .


0

C, CPP 코드에서 검색하기위한 스크립트 (코드 찾기) :

#!/bin/sh

find . \( -iname "*.c" -o -iname "*.cpp" -o -iname "*.h" \) -type f -print0 | xargs -0 grep --color -n "$1"

사용하다:

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