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