특정 텍스트 문자열을 포함하는 모든 파일에 대해 전체 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.
