[linux] Linux에서 특정 텍스트를 포함하는 모든 파일을 찾으려면 어떻게합니까?

특정 텍스트 문자열을 포함하는 모든 파일에 대해 전체 Linux 시스템을 스캔하는 방법을 찾으려고합니다. 명확히하기 위해 파일 이름이 아닌 파일 내에서 텍스트를 찾고 있습니다.

이 작업을 수행하는 방법을 찾을 때이 솔루션을 두 번 발견했습니다.

find / -type f -exec grep -H 'text-to-find-here' {} \;

그러나 작동하지 않습니다. 시스템의 모든 단일 파일을 표시하는 것 같습니다.

이것이 올바른 방법에 가깝습니까? 그렇지 않다면 어떻게해야합니까? 파일에서 텍스트 문자열을 찾는 기능은 내가하고있는 일부 프로그래밍 프로젝트에 매우 유용합니다.



답변

다음을 수행하십시오.

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r-R재귀 적이 거나
  • -n 줄 번호이고
  • -w 단어 전체와 일치합니다.
  • -l 일치하는 파일의 파일 이름을 제공하기 위해 (소문자 L)을 추가 할 수 있습니다.

이들과 함께, --exclude, --include, --exclude-dir플래그는 효율적인 검색을 위해 사용될 수있다 :

  • 확장자가 .c 또는 .h 인 파일 만 검색합니다.

    grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
    
  • 확장자가 .o 인 모든 파일을 검색하는 것은 제외됩니다.

    grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
    
  • 디렉토리의 경우 --exclude-dir매개 변수를 통해 특정 디렉토리를 제외 할 수 있습니다 . 예를 들어 dirs dir1 /, dir2 / 및 * .dst /와 일치하는 모든 디렉토리는 제외됩니다.

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

이것은 당신과 거의 같은 목적을 달성하기 위해 저에게 매우 효과적입니다.

더 많은 옵션을 확인하십시오 man grep.


답변

당신은 사용할 수 있습니다 grep -ilR:

grep -Ril "text-to-find-here" /
  • i 대소 문자 무시를 나타냅니다 (귀하의 경우 선택 사항).
  • R 재귀를 나타냅니다.
  • l “결과 자체가 아니라 파일 이름 표시”를 나타냅니다.
  • / 컴퓨터의 루트에서 시작을 나타냅니다.

답변

ack 을 사용할 수 있습니다 . 소스 코드의 grep 과 같습니다 . 전체 파일 시스템을 스캔 할 수 있습니다.

그냥 해:

ack 'text-to-find-here'

루트 디렉토리에서

정규 표현식 을 사용하고 파일 형식을 지정할 수도 있습니다 .


최신 정보

방금 은색 과 비슷하지만 그보다 3-5 배 빠르며 .gitignore파일의 패턴을 무시하는 The Silver Searcher를 발견 했습니다 .


답변

당신이 사용할 수있는:

grep -r "string to be searched"  /path/to/dir

r너무 재귀와도 하위 디렉토리를 지정된 경로에서 검색합니다 의미합니다. 파일 이름을 알려주고 문자열이 나타나는 파일의 줄을 인쇄합니다.

또는 모든 자바 스크립트 파일 (* .js)에서 검색하기 위해 시도하는 것과 유사한 명령 (예 🙂 :

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

텍스트가 나타나는 파일의 행을 인쇄하지만 파일 이름은 인쇄하지 않습니다.

이 명령 외에도 다음과 같이 작성할 수도 있습니다.
grep -rn “문자열 검색”/ path / to / directory / or / file
-r : 재귀 검색
n : 일치하는 행 번호가 표시됩니다.


답변

이것을 사용할 수 있습니다 :

grep -inr "Text" folder/to/be/searched/


답변

주어진 텍스트를 포함하는 파일 이름 목록

우선, 나는 당신이 -H대신 사용했다고 생각합니다 -l. 또한 따옴표 안에 텍스트를 추가하고 뒤에을 추가 할 수 있습니다 {} \.

find / -type f -exec grep -l "text-to-find-here" {} \;

디렉토리 안에 특정 텍스트 “Apache License”가 포함 된 파일을 검색한다고 가정 해 봅시다. 아래와 다소 비슷한 결과가 표시됩니다 (디렉토리 내용에 따라 출력이 다름).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \;
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$

대소 문자 구분 제거

“text”대 “TEXT”와 같은 대소 문자를 사용하지 않더라도 -i스위치를 사용하여 대소 문자를 무시할 수 있습니다 . 자세한 내용은 여기를 참조 하십시오 .

이것이 도움이되기를 바랍니다.


답변

grep( GNU 또는 BSD )

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

grep -r "class foo" .

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

globbing 구문을 사용하여 다음과 같은 특정 파일 내에서 검색 할 수도 있습니다.

grep "class foo" **/*.c

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

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

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

또는을 사용하십시오 ripgrep.

ripgrep

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

rg "class foo" .

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

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

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


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

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