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


5256

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

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

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

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

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


21
grep은 무엇이든 .단일 문자 와일드 카드로 해석한다는 점을 기억하십시오 . 내 조언은 항상 fgrep 또는 egrep을 사용하는 것입니다.
Walter Tross

10
어쨌든 거의 다 왔습니다! 그냥 교체 -H와 함께 -l(그리고 아마도 grepfgrep). find보다 고급 방식으로 사용할 특정 패턴의 이름을 가진 파일을 제외합니다 . find그래도 사용법을 익히는 것이 가치가 있습니다 . 그냥 man find.
Walter Tross

6
find … -exec <cmd> +보다 입력하기 쉽고 빠릅니다 find … -exec <cmd> \;. <cmd>많은 수의 파일 이름 인수를 허용하는 경우에만 작동합니다 . <cmd>파이썬이나 루비 스크립트처럼 시작 시간이 느리면 실행 시간이 절약됩니다 .
hagello

주어진 경로에서 비재 귀적으로 검색하기위한 명령은`grep --include = *. txt -snw "pattern"thepath / *입니다.
Stéphane Laurent

@ StéphaneLaurent 당신이 너무 복잡하다고 생각합니다. 그냥 말grep "pattern" path/*.txt
fedorqui가 'SO 해치지 중지'

답변:


9513

다음을 수행하십시오.

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.


74
--exclude를 사용하십시오. "grep -rnw --exclude = *. o 'directory'-e"pattern "
rakib_

98
주목할만한 가치가 있습니다 : r옵션이 게으른 것 같습니다 (첫 번째 디렉토리 다음에 멈추는 것보다 깊이 우선 우선), R욕심이 있습니다 (전체 트리를 올바르게 통과합니다).
Eliran Malka

5
grep -rnw "찾고있는 문자열"이 필요한 작업을 수행했습니다. 감사!
ViliusK

33
참고 (특히 초보자의 경우) : 위 명령에서 따옴표가 중요합니다.
madD7

69
@Eliran Malka Ren r는 디렉토리를 올바르게 탐색하지만 R심볼릭 링크를 따릅니다.
bzeaman

1497

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

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

85
내 경험에 따르면 -i속도가 많이 느려지므로 필요하지 않으면 사용하지 마십시오. 특정 디렉토리에서 테스트 한 다음 일반화하십시오. 몇 분 안에 완료해야합니다. 정규식이 더 느려질 것이라고 생각합니다. 그러나 내 의견은 가정을 기반으로 time하므로 줄 앞에서 테스트하는 것이 좋습니다 .
fedorqui 'SO 중지 피해'

4
그렇습니다 /*. 어쨌든 나는 그것을 테스트하고 그것이 /효과가 있음을 알았습니다 .
fedorqui 'SO 중지 피해'

10
정규식을 사용하여 검색하지 않으면 대부분의 시스템에서 grep 대신 fgrep을 사용할 수 있습니다.
markle976

8
예 @ markle976, 사실 사람 grep에서 fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings.
fedorqui 'SO 중지 피해'

17
/를 디렉토리 경로로 바꾸 grep -Ril "text-to-find-here" ~/sites/거나 사용할 수 있습니다. 현재 디렉토리grep -Ril "text-to-find-here" .
Black

329

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

그냥 해:

ack 'text-to-find-here'

루트 디렉토리에서

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


최신 정보

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


57
매우 유용하고 간단하며 빠릅니다. 경고 : "데비안 파생 배포판에서"ack "이 이미 존재하기 때문에 ack는"ack-grep "으로 패키지되어 있습니다 ( beyondgrep.com/install에서 ).
리눅스

11
ack 또는 ack-grep의 특징은 훌륭하지만 적절한 사용시 find + grep이 성능면에서 훨씬 우수합니다
Sławomir Lenart

14
하는 것으로 ripgrep가 더 빠르다 다른 실버 검색 자 및 일반 '팔자 그렙을 포함하여, 여기에 언급 무엇보다. 증거는 이 블로그 게시물 을 참조하십시오 .
Radon Rosborough

194

당신이 사용할 수있는:

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 : 일치하는 행 번호가 표시됩니다.


1
찾기 버전에 대한 감사합니다. 내 grep 버전 (busybox for NAS)이 -r 옵션이 아니므로 다른 솔루션이 필요했습니다!
jc

3
'찾기'버전에 감사합니다! ' .js'또는 ' .txt'등 으로 필터링 할 수있는 것이 중요합니다 . 명령이 입력하기 쉽습니다.
mightypile

허용 된 버전보다 더 나은 grep, 허용 된 반 단어를 검색하지 않기 때문에
waza123

114

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

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

12
가장 쉽고, 장황하고, 재귀 적이며 대소 문자를 구분하지 않습니다. 엄지 손가락.
Francesco Casula

-A3를 추가하면 더 좋습니다
albanx

73

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

우선, 나는 당신이 -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스위치를 사용하여 대소 문자를 무시할 수 있습니다 . 자세한 내용은 여기를 참조 하십시오 .

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


2
이 명령은 다음과 같습니다 . find찾은 모든 경로를 명령에 전달합니다 grep -l "text-to-find-here" <file found>". 파일 이름에 제한을 추가 할 수 있습니다 (예 : find / -iname "*.txt"이름이 끝나는 파일 만 검색.txt
Mene

1
@Auxiliary-독자의 혼동을 피하기 위해 샘플 출력이 포함되었습니다.
lkamal

2
@Mene Auxiliary의 의견이 귀하의 의견보다 더 많은 투표를 한 것은 슬픈 일입니다 ... 2014 년의 의견이 2017 년이고 귀하의 의견이 정확히 0이어야하고 귀하의 의견이 1 개 (현재 2 개) 만있는 경우에 6 명이있는 경우에도 마찬가지입니다. 내가 믿고 싶은 것이 아닙니다.
Pryftan

@Mene 그것은 -iname대소 문자를 구분하지 않으므로 TxT 및 TXt와 같은 .TXT 파일도 찾을 수 있습니다.
Pryftan

66

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.

1
또한 확장 글러브가 유용하다는 것을 알았습니다. 그러나 실제로 파일 수가 너무 많으면 "인수 목록이 너무 깁니다"오류가 발생할 수 있습니다. (간단한 글 로빙도 이런 종류의 오류가 발생하기 쉽습니다).
Yoory N.

2
전체 파일 시스템을 흡입하면 rg는 다른 도구보다 훨씬 덜 고통 스럽습니다.
lk

55

grep재귀 검색을 지원하지 않는 경우 다음 find과 결합 할 수 있습니다 xargs.

find / -type f | xargs grep 'text-to-find-here'

에 대한 형식보다 기억하기가 더 쉽습니다 find -exec.

파일 이름과 일치하는 줄의 내용을 출력합니다.

/home/rob/file:text-to-find-here

추가하려는 옵션 플래그 grep:

  • -i -대소 문자를 구분하지 않는 검색
  • -l -일치하는 파일 이름 만 출력
  • -h -일치하는 줄만 출력하십시오 (파일 이름이 아님).

3
아무것도 찾지 못하면 grep 'text-to-find-here'파일 이름 이 없는 것과 같습니다 find. 정지하고 사용자 입력을 기다립니다! --no-run-if-empty에 옵션으로 추가하십시오 xargs.
hagello

3
파일 및 디렉토리 이름에 공백 (xargs가 구분 기호로 해석되는 문자)이 포함 된 경우 이러한 find 및 xargs 조합은 의도 한대로 작동하지 않습니다. 사용하십시오 find … -exec grep … +. xargs와 함께 find를 사용해야한다면 -print0and를 사용하십시오 -0.
hagello

43
grep -insr "pattern" *
  • i: 패턴과 입력 파일의 대소 문자 구분을 무시하십시오.
  • n: 각 출력 행 앞에 입력 파일 내의 1 기반 행 번호를 접 두부로 사용하십시오.
  • s: 존재하지 않거나 읽을 수없는 파일에 대한 오류 메시지를 표시하지 않습니다.
  • r: 각 디렉토리 아래의 모든 파일을 재귀 적으로 읽습니다.

3
다른 답변에 대한 답변이 어떻게 향상되는지 또는 다른 답변과 어떻게 다른지 설명 할 수 있습니까?
Amos M. Carpenter

기억하기가 복잡하지 않고 모든 패턴 (대소 문자 구분-> 꺼짐, 파일 이름 및 줄 번호 포함 및 재귀 적으로 검색 등)을 다루며 마지막에 "*"를 사용하면 모든 디렉토리를 검색합니다 (어떤 것도 지정할 필요가 없습니다) 경로 또는 디렉토리 이름).
enfinet

죄송합니다. 더 명확해야합니다. 답변에 해당 설명을 포함 할 수 있다면 좋을 것입니다. 특히 많은 다른 유사한 답변이 이미 존재하기 때문에 받아 들여진 답변이나 찬성 한 답변 중 하나를 시도 했을 때 의 이점이 무엇인지 짧은 답변에서 알기가 어렵습니다 .
Amos M. Carpenter

6
@ AmosM.Carpenter이 답변에서 내가 좋아하는 것 중 하나는 suppress 인수를 지적하는 것인데, 실제로 우리가 원하는 결과를 얻는 데 중요하지 않은 노이즈를 걸러내는 데 도움이 될 수 있습니다. Grep은 특정 "파일"에 "Function not implementation", "Invalid Argument", "Resource available"등과 같은 오류를 인쇄합니다.
leetNightshade

@leetNightshade : 나는 희소 원본 게시물에 대한 설명을 요청했기 때문에 당신이 나에게 당신의 의견을 말하고 있다고 가정합니다. 이전 의견에 대한 Fabio의 훌륭한 개정판 을 참조하십시오 .
Amos M. Carpenter

39

Silversearcher 라는 새로운 유틸리티가 있습니다

sudo apt install silversearcher-ag

Git 및 다른 VCS와 밀접하게 작동합니다. 따라서 .git 또는 다른 디렉토리 에는 아무것도 얻지 못합니다 .

간단하게 사용할 수 있습니다

ag "Search query"

그리고 그것은 당신을 위해 일을 할 것입니다!


35

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

이 솔루션을 두 번 보았습니다.

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


사용하는 경우 찾기를 귀하의 예제처럼, 더 추가 -s( --no-messages)하는 grep, 그리고 2>/dev/null의 회피를 많이하는 명령의 끝에서 권한이 거부 메시지를 발행 grep하고 find:

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

find 는 Unix와 유사한 플랫폼에서 특정 텍스트를 찾을 때 grep과 결합 된 파일 검색을위한 표준 도구입니다. 그런데 find 명령은 종종 xargs 와 결합됩니다.

같은 목적으로 더 빠르고 쉬운 도구가 존재합니다 (아래 참조). 물론 플랫폼 에서 사용할 수 있다면 더 잘 사용해보십시오 .

더 빠르고 쉬운 대안

RipGrep- 가장 빠른 검색 도구 :

rg 'text-to-find-here' / -l

실버 검색기 :

ag 'text-to-find-here' / -l

ack :

ack 'text-to-find-here' / -l

참고 : 2>/dev/null이러한 오류 명령을 추가 하여 많은 오류 메시지를 숨길 수 있습니다.


경고 : 실제로 피할 수 없다면 , 길고 비효율적 인 검색을 피하기 위해 '/' (루트 디렉토리) 에서 검색하지 마십시오! 따라서 위의 예에서 ' / '를 실제로 검색하려는 위치에 따라 하위 디렉토리 이름 (예 : "/ home")으로 바꾸는 것이 좋습니다 .


'find는 유닉스 계열 플랫폼에서 특정 텍스트를 포함하는 파일을 검색하기위한 표준 도구입니다'라는 것이 다소 모호한 것 같습니다. 재귀 외에도 grep find파일 내부에서 직접 텍스트를 검색하지는 않습니다. 그리고 그 추가 도구는 오래된 타이머가 아닌 일부 타이머에는 유용 ​​할 grep것입니다. 예를 들어 익숙한 사람들은 시간을 전혀주지 않을 것입니다. 그들은 쓸모 없다고 말하지 않습니다.
Pryftan

".... 특정 텍스트 포함 ...": 문장의이 부분이 정확하지 않습니다 (검색의이 부분을 다루는 자체가 없기 때문에). 편집했습니다. 감사.
Bludzee

도움이되어 기쁘다! 아주 빨리 한 눈에 볼 수있는 유일한 것은 폴더디렉토리로 변경하는 것입니다. 그러나 나는 그것이 절대로 이길 수 없다는 나의 성전임을 알고 있습니다. 포기하지는 않지만 ...
Pryftan

"폴더"대신 "디렉토리"가 아닌 이유는 무엇입니까? "십자군"을 공유하십시오!
Bludzee

대신 디렉토리를 사용한다고 말하고 있습니다! 참조 : 하위 폴더 이름으로 '/'를 바꾸는 것이 좋습니다 . Windows의 경우조차도 '디렉토리'라고 부르기 때문에 esp입니다. 아 .. 어쩌면 당신은 그것을 얻었다. 왜? 그게 바로 그것이 기 때문입니다. 파일 시스템 수준에서도이를 호출합니다. 이제까지 (DOS 용)라고했다 : 그리고 그것을 이런 식으로 봐 fol? 물론 아닙니다. 그것은 불렀습니다 dir(그리고 나는 여전히 믿습니다). 폴더는 사용자 편의성을 위해 고안된 것입니다.이 경우에는 덜 '고급'사용자를 위해 폴더를 어둡게 만들 수 있습니까?
Pryftan

29

시험:

find . -name "*.txt" | xargs grep -i "text_pattern"

5
이것은 실제로 그렇게 사용하지 않을 때의 주요 예입니다 xargs. 이것을 고려하십시오. echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo. 는 xargs여기에 잘못된 파일을 일치하고 의도 된 파일과 일치하지 않았다. 둘 중 하나를 사용 find .. -print0 | xargs -0 ...하지만 파이프의 쓸모없는 사용 또는 더 나은find ... -exec grep ... {} +
shalomb

29

pwd아래로 되풀이되는 모든 디렉토리에서 검색하는 데 사용

grep -rnw `pwd` -e "pattern"

업데이트 사용중인 grep 버전에 따라를 생략 할 수 있습니다 pwd. 새로운 버전의 .디렉토리는 디렉토리가 없으면 grep의 기본 경우 인 것 같습니다.

grep -rnw -e "pattern"

또는

grep -rnw "pattern"

위와 동일한 작업을 수행합니다!


3
pwd기본값이므로 사용 이 전혀 필요하지 않습니다. grep -rnw "pattern"충분하다.
fedorqui 'SO 중지 피해'12

실제로 grep -rnw3 년 전과 같이 대답 한 것과 비슷한 것이이 답변이 어떻게 가치를 더하는지 알 수 없습니다.
fedorqui 'SO 중지 피해'12

선택된 답변은 기본 패턴을 보여주지 않으며 5
명이

"기본 패턴"이란 무엇입니까? 허용 된 답변에는 grep -rnw '/path/to/somewhere/' -e "pattern"여기에있는 내용이 포함 됩니다. 2.3M 방문 후 5 표가 그렇게 많은 것을 의미하지는 않습니다.
fedorqui 'SO 중지 피해'12

동의합니다 :-) 원래 답변에서 누락 된 것은 사용 경로에 전혀 경로를 제공하거나 현재 디렉토리를 재귀 적으로 검색 할 필요가 없으며 허용 된 답변에 반영되지 않은 유스 케이스입니다. 따라서 grep을 조금 더 깊이 파는 것이 좋은 학습 경험이었습니다.
mahatmanich

19

grep 문자열을 찾지 않아도 사용할 수 있습니다.

달리기 만하면

grep -RIl "" .

모든 텍스트 파일, 즉 인쇄 가능한 문자 만 포함 된 경로를 인쇄합니다.


2
나는이 단순한 사용하는 것보다 더 좋은 방법이 표시되지 않습니다 ls또는 find(재귀에 대한)
'SO 정지 해치지'fedorqui을

17

파일을 검색하는 데 사용할 수있는 몇 가지 명령 목록은 다음과 같습니다.

grep "text string to search” directory-path

grep [option] "text string to search” directory-path

grep -r "text string to search” directory-path

grep -r -H "text string to search” directory-path

egrep -R "word-1|word-2” directory-path

egrep -w -R "word-1|word-2” directory-path

5
기존 답변에 추가되는 것은 무엇입니까?
fedorqui 'SO 중지 피해'12

@fedorqui egrep는 이에 해당하며 여기서 세부 정보를 찾을 수 grep -E있음 --extended-regexp을 의미 합니다. unix.stackexchange.com/a/17951/196072
omerhakanbilici


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

의견 설명

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

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename

15

시험:

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

/루트 폴더 이기 때문에 모든 파일 시스템을 검색 합니다.

홈 폴더 사용의 경우 :

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

현재 폴더 사용 :

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

아마도 폴더의 차이점에 대한 세부 사항은 많은 사람들에게 분명하지만 초보자에게는 매우 유용합니다. +1
nilon

1
기존 답변에 추가되는 것은 무엇입니까?
fedorqui 'SO 중지 피해'12

그것을 나의 십자군이라고 부르십시오. 그러나 단어는 'directory'입니다. 이것은 Windows가 아닙니다 (어쨌든 '디렉토리'를 사용하는 데 사용되었습니다-9x 이전). '폴더'라고 말하지 마십시오. 마지막 명령은 '/'만 필요하지 않습니다.
Pryftan

15

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

grep텍스트를 수행 할 수있는 파일에서 줄 번호를 얻기 위해 출력에 추가 정보를 제공하기 위해 비트를 확장하면 다음과 같이 수행 할 수 있습니다.

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

그리고 당신은 파일 형식이 경우, 검색 할 파일 확장명을 지정하여 검색 범위를 좁힐 수 있습니다 무엇인지 생각이있는 경우 .pas또는 .dfm파일 :

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

옵션에 대한 간단한 설명 :

  1. .에서 find현재 디렉토리에서 지정합니다.
  2. -name" *.*": 모든 파일 (-name " *.pas"-o -name " *.dfm") : *.pasOR *.dfm파일 만-o
  3. -type f 파일을 찾고 있음을 지정합니다
  4. -print0--null의 반대쪽에 |(파이프)로부터 파일명을 전달하는 중요한 것들 find받는 grep에 매립 xargs한 문자열 경로와 파일 이름을 치료 그렙 있도록, 파일명에 공백 파일명의 통과를 허용 각 공간에서 분리하지 마십시오.

-name '*.*'당신이 말하는 것이 아닙니다. 패턴이 그것과 동일하지 않기 때문에 'file'이라는 파일을 선택하지 않습니다 (.ext 없음). *그러나 (잘 파일을 제쳐두고). 그러나 또 다른 것이 있습니다. 모든 파일을 원한다면 왜 처음에 파일 이름을 지정해야합니까? 다른 의견은 없습니다-MS 용어 '폴더'를 사용하지 않는 사람들이 여전히 있다는 것을 알고 있다는 점을 제외하고는 정말 좋은 점입니다. 파일 이름- 'all'의 경우 중복 / 무용도).
Pryftan

15

간단 find하게 작동 할 수 있습니다. ~/.bashrc파일 에서 별명을 지정 하십시오.

alias ffind find / -type f | xargs grep

새로운 터미널을 시작하고 발행하십시오 :

ffind 'text-to-find-here'

14

비슷한 것을 하는 Python 스크립트 를 작성했습니다 . 이것이이 스크립트를 사용하는 방법입니다.

./sniff.py path pattern_to_search [file_pattern]

첫 번째 인수 path는 재귀 적으로 검색 할 디렉토리입니다. 두 번째 인수 pattern_to_search는 파일에서 검색하려는 정규식입니다. Python re 라이브러리에 정의 된 정규식 형식을 사용합니다 . 이 스크립트에서는 .개행과도 일치합니다.

세 번째 인수 file_pattern는 선택 사항입니다. 파일 이름에서 작동하는 또 다른 정규식입니다. 이 정규식과 일치하는 파일 만 고려됩니다.

예를 들어, 확장자 pyPool(다음에 word가 포함 된 Python 파일을 검색 Adaptor하려면 다음을 수행하십시오.

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

그리고 voila는 일치하는 파일의 경로와 일치하는 줄 번호를 생성합니다. 일치하는 항목이 두 개 이상 있으면 각 줄 번호가 파일 이름에 추가됩니다.


14

엄격히 사용하려면 find다음을 사용하십시오 find + grep.

find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;

단계 :

1. find파일 검색 에 사용 2. 모든 파일에서
실행grep

이를 통해 find파일을 찾을 수 있습니다.

  • 특정 파일 만 -name Pattern원하는 경우에 사용하십시오 grep.

    find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;

당신은 그것으로 재생하고 다른 옵션을 사용 find하여 파일 검색을 개선하거나 좁힐 수 있습니다.


차이점은 무엇입니까? 파일 경로에서 공백으로 작동합니까?
피터 모텐슨

13

사용하다:

grep -c Your_Pattern *

현재 디렉토리의 각 파일에 몇 개의 패턴 사본이 있는지보고합니다.


13

grep 은 이것을 달성하기위한 좋은 친구입니다.

grep -r <text_fo_find> <directory>

찾을 텍스트의 경우에 신경 쓰지 않으면 다음을 사용하십시오.

grep -ir <text_to_find> <directory>

제 경우에는 디렉토리를 지정하더라도 모든 곳에서 검색하는 것처럼 보입니다
Pathros

@Pathros 아마도 재귀를 활성화하고 지정한 디렉토리와 관련이 있습니다. 다른 방식으로 재귀가 그런 식으로 변화합니다.
Pryftan

@Pathros 아 그리고 -검색 문자열에 s 가 있으면 --grep에 먼저 전달하고 싶을 것이다 . 그렇지 않으면 재미있는 부작용을 일으킬 수 있습니다!
Pryftan

13

간단한 grep 이 'rl'로 만드는 방법에 매료되었습니다 .

grep -rl 'pattern_to_find' /path/where/to/find

-r to recursively find a file / directory inside directories..
-l to list files matching the 'pattern'

'l'없이 '-r'을 사용하여 파일 이름 과 패턴이있는 텍스트를 확인하십시오 !

grep -r 'pattern_to_find' /path/where/to/find

그것은 완벽하게 작동합니다 ...


이것은 또한 Git Bash (Windows) 에서도 작동합니다 .
Peter Mortensen

그러나 모든 파일을 검색해야 함을 의미합니다 (파일 이름 또는 파일 확장명 수준과 같은 필터 없음 .txt). 아니면 그렇게 할 수 있습니까?
피터 Mortensen

12

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

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;

1
사용과 비교할 때 단점 find … -exec grep 'str' {} \;이 있습니다 find(전혀 사용해야하는 경우 ).
phk

1
find포함 된 공백으로 찾은 파일이 있으면 끔찍하게 중단 됩니다 grepping. 잘못된 파일이 만들어 지거나 올바른 파일이 모두 누락 될 수 있습니다. 그냥 사용 find ... -exec grep ...하면 사용 할 필요가있는 경우 find..하지만이 경우 grep -r ...접미사를.
shalomb

1
find to grep 결과에 루프를 사용하는 요점은 무엇입니까? 불필요하게 복잡해집니다.
fedorqui 'SO 중지 피해'12

12

ack원하는 것을 정확하게 수행 할 수 있는 도구가 있습니다.

http://linux.die.net/man/1/ack

ack -i search_string folder_path/*

-i대소 문자 구분 검색을 무시할 수 있습니다


2
기존 답변에 추가되는 것은 무엇입니까? 이것은 이미 3 년 전에 제안되었습니다.
fedorqui 'SO 중지 피해'12

1
@fedorqui 1) 배관 없음! 2) 정규 표현식 사용 3) 검색 후 편집에 유용한 줄 번호, 상대 경로가있는 파일 이름, 강조 표시된 텍스트 등을 가져옵니다 (예 : "vim + lineno path / file.cpp")는 관심없는 줄에서 바로 찾을 수 있습니다. 내 검색 폴더 및 하위 폴더에서 "include"또는 "hpp"키워드를 검색하는 "ack include \ | hpp"명령의 출력을 참조하십시오. 요점이 분명하기를 바랍니다. 다음은 샘플 출력입니다 (단순한 텍스트로 키워드 하이라이트를 표시 할 수 없음) process / child.hpp 11 : boost / process / child.hpp process / all.hpp 21 : #include <boost / process / execute.hpp>
Pal

12

이전의 모든 답변은 grep and find를 제안합니다. 그러나 다른 방법이 있습니다 : Midnight Commander 사용

GUI가 아닌 시각적 인 무료 유틸리티 (30 세, 시간에 의해 입증 됨)입니다. 그것은 많은 기능을 가지고 있으며 파일 찾기는 그중 하나입니다.


레인저는 같은 생각에있을 것입니다
nilon

11

아래 명령은이 접근법에 적합합니다.

find ./ -name "file_pattern_name"  -exec grep -r "pattern" {} \;

2
사용의 시점 무엇을 find다음과 grep -r? 그것들은 같은 것을 의미하기 때문에 이것은 중복입니다.
fedorqui 'SO 중지 피해

아 !! 수정 됨, 실제로 찾기는 필터링 된 파일에서 grep을 실행하기위한 것이며 전부는 아닙니다.
Pradeep Goswami

2
여전히, 이것은 말이되지 않습니다 find.로 필터링 할 수 있습니다 .
fedorqui 'SO 중지 피해'12

11

번거 로움을 피하고 ack-grep을 설치하십시오. 많은 권한 및 인용 문제를 제거합니다.

apt-get install ack-grep

그런 다음 검색하려는 디렉토리로 이동하여 아래 명령을 실행하십시오.

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