grep을 사용하여 폴더 내에서 단어를 찾으려면 어떻게해야합니까?


542

Windows에서는 폴더 내에서 단어를 찾기 위해 검색을 수행했을 것입니다. 마찬가지로 많은 하위 디렉토리와 파일을 포함하는 디렉토리 내에서 특정 단어가 발생하는지 알고 싶습니다. grep 구문을 검색하면 파일 이름, 즉을 지정해야합니다 grep string filename.

이제 파일 이름을 모르므로 어떻게해야합니까? 친구가 할 것을 제안 grep -nr string했지만 이것이 무엇을 의미하는지 모르겠으며 결과가 없습니다 (을 발행 할 때까지 응답이 없습니다 ctrl + c).

답변:


848
grep -nr 'yourString*' .

끝에있는 점은 현재 디렉토리를 검색합니다. 각 매개 변수의 의미 :

-n            Show relative line number in the file
'yourString*' String for search, followed by a wildcard character
-r            Recursively search subdirectories listed
.             Directory for search (current directory)

grep -nr 'MobileAppSer*' . ( MobileAppServlet.java또는 MobileAppServlet.class또는 MobileAppServlet.txt;을 찾을 'MobileAppASer*.*'수 있지만 동일한 작업을 수행하는 다른 방법입니다.)

더 많은 매개 변수를 확인하려면 man grep 명령을 사용하십시오 .


14
사업은 *무엇입니까? 쉘 와일드 카드 확장 (와일드 카드 패턴과 일치하는 파일 이름이있는 경우)이 발생하거나 grep이이를 선행 문자에 대해 0 이상의 반복 연산자로 사용합니다 *.
usta

7
이제 grep -nr MobileAppSer* .1에 대한 두 가지 가능성을 모두 고려해 봅시다. 현재 디렉토리에 MobileAppSer*와일드 카드 패턴과 일치하는 3 개의 파일 ( named MobileAppServlet.java,, MobileAppServlet.class) 이 있다고 가정합니다 MobileAppServlet.txt. 그런 다음 다음 grep과 같이 호출됩니다 grep -nr MobileAppServlet.class MobileAppServlet.java MobileAppServlet.txt ... 이는 MobileAppServlet.java, MobileAppServlet.txt 파일 및 현재 디렉토리의 다른 위치에서 "MobileAppServlet.class"텍스트를 검색하는 것을 의미합니다. 사용자가 원하는 것은 아닙니다.
usta

7
2. 현재 디렉토리에 MobileAppSer*와일드 카드 패턴과 일치하는 파일이없는 경우 grep인수를있는 MobileAppSer*그대로 수신하여 "MobileAppSe"텍스트를 찾은 다음 "r"이 0 번 이상 나타나는 텍스트로 검색합니다. 현재 디렉토리의 파일 내용에서 "MobileAppSe", "MobileAppSer", "MobileAppSerr", "MobileAppSerrr"등의 텍스트를 찾으려고 시도하십시오.
usta

5
이것은 정규 표현식의 모호한 선택입니다. Usta는 이것을 지적했다.
kindasimple

117
grep -nr string my_directory

추가 사항 : grep [options] string filenameUnix 계열 시스템에서 디렉토리는 일종의 파일이기 때문에 구문을 만족시킵니다 (Windows에서는 "파일"이라고하는 엔티티를 구체적으로 지칭하는 "일반 파일"이라는 용어가 있습니다).

grep -nr string 표준 입력에서 검색 할 컨텐츠를 읽습니다. 따라서 입력을 기다리기만하고 ^ C를 누를 때 중지합니다 (^ D에서 중지됨). -파일).


1
그래, 대소 문자에 관계없이 문자열을 검색하려면 grep -i -nr "my word"을 수행해야합니다.
kiki

2
@kiki : 예,grep -inr "my word" .
usta

16
@kiki : -rgrep은 하위 디렉토리에서 재귀 적으로 검색 -n하는 것을 의미하며 각 출력 행 앞에 해당 행을 포함하는 파일의 해당 행 번호를 접두어로 사용합니다. man grep이 모든 것을 설명합니다.
usta

62

GREP : 글로벌 정규식 인쇄 / 파서 / 프로세서 / 프로그램.
이것을 사용하여 현재 디렉토리를 검색 할 수 있습니다.
"재귀"에 -R을 지정할 수 있습니다. 즉, 프로그램은 모든 하위 폴더와 하위 폴더 및 하위 폴더의 하위 폴더 등을 검색합니다.

grep -R "your word" .

-n파일에서 일치하는 줄 번호를 인쇄합니다.
-i대소 문자를 구분하지 않고 검색합니다 (대문자 / 비대 문자).

grep -inR "your regex pattern" .

3
./* 수단을 현재 디렉토리에있는 모든 파일, -R 수단 (등 하위 디렉토리를 검색) 재귀
스테판 스타 이거

25
grep -nr search_string search_dir

search_string에 대해 RECURSIVE (디렉토리 및 모든 서브 디렉토리를 의미 함) 검색을 수행합니다. (usta가 올바르게 대답 한대로).

친구의 제안에 대해 아무런 대답을 얻지 못한 이유는 다음과 같습니다.

grep -nr string

디렉토리가 지정되지 않았기 때문입니다. 검색하려는 디렉토리에있는 경우 다음을 수행해야합니다.

grep -nr string .

'.'를 포함하는 것이 중요합니다. grep에게이 디렉토리를 검색하도록 지시합니다.


안녕, 사이에 공백이있는 두 단어를 검색해야한다면 어떻게해야합니까? 따옴표 안에 단어를 지정해야합니까? 즉, grep -nr "my word"입니다.
kiki

24

또한있다 :

find directory_name -type f -print0 | xargs -0 grep -li word

하지만 초보자에게는 다소 도움이 될 것입니다.

find-type f"디렉토리 및 명명 된 파이프가 아닌 일반 파일을 찾는 것"및 " -print0널 문자를 구분 기호로 사용하여 표준 출력에 인쇄 "를 의미 하는 범용 디렉토리 워커 / 리스너 입니다. 에서 출력 find이 전송되고 xargs -0표준 줄 바꿈 대신 레코드 구분 기호로 널 문자를 사용하여 표준 입력을 청크로 표시합니다 (명령 행 길이 제한을 피하기 위해) grep -li word. 각 파일 세트에 적용됩니다 . 온 grep, -l수단 "파일 목록 일치하는"및 -i수단 "의 경우를 구분"; 일반적으로 단일 문자 옵션을 결합하여 -li보다 자주 볼 수 있습니다 -l -i.

당신이 사용하지 않는 경우 -print0그리고 -0당신은 그들을 사용하는 것은 좋은 습관이다, 그래서 공백이 포함 된 파일 이름 문제로 실행됩니다.


1
@mmmshuddup : 감사합니다. 나는 특히 초보자와 함께 일할 때 대답의 일부로 설명을하지 않으면 기분이 좋지 않습니다.
mu는 너무 짧습니다

1
이것이이 사이트에서 가장 높이 평가 한 내용입니다. 우리 모두가 한 번 초보자였으며 기술 세계에서는 쉽지 않다는 것을 기억하는 것이 중요합니다!
예 Barry

특정 디렉토리를 제외 할 수 있습니까? @muistooshort
Ferologics

@Ferologics man find명령 줄에서 find지원 하는 옵션을 확인하십시오 .
mu는 너무 짧습니다

8

하위 디렉토리에서 모든 인스턴스를 찾기 위해 재귀 검색을 수행하지 않는 이유는 무엇입니까?

grep -r 'text' *

이것은 매력처럼 작동합니다.


1
공간과 같은 특별한 문자와 인용 검색 문자열에 대한 필요가 없습니다
스콧 Stensland

5
  1. grep -r "yourstring" * 모든 파일과 폴더에서 "yourstring"을 찾습니다

이제 두 개의 다른 문자열을 동시에 찾으려면 언제든지 옵션 E를 사용하고 검색 할 단어를 추가 할 수 있습니다. 휴식 후의 예

  1. grep -rE "yourstring|yourotherstring|$" *목록의 위치를 검색 할 수 yourstring또는 yourotherstring일치

4

내가 사용하고 싶은 다른 옵션 :

find folder_name -type f -exec grep your_text  {} \;

-type f는 폴더가 아닌 파일 만 반환합니다.

-exec 및 {}은 검색에서 찾은 파일에서 grep을 실행합니다 (정확한 구문은 "-exec 명령 {}"입니다).


4
grep -R "string" /directory/

-r이 그렇지 않은 경우 -R도 심볼릭 링크를 따릅니다.


2

선택한 답변은 괜찮으며 작동하지만 올바른 방법은 아닙니다.

grep -nr yourString* .

실제로 문자열을 검색 "yourStrin"하고 "g"0 번 또는 여러 번 검색합니다 .

따라서 올바른 방법은 다음과 같습니다.

grep -nr \w*yourString\w* .

이 명령은 현재 폴더에서 전후에 임의의 문자로 문자열을 검색합니다.


2
그러나 grep -nr yourString이 베어를 찾습니다으로도 작동 yourString라인 어디서나 (또는 내 시스템, OSX 라이온에 않습니다 적어도)
theheadofabroom

1

@eLRuLL이 게시 한 답변과 유사하게 단어 경계를 존중하는 검색을 지정하는 더 쉬운 방법은 -w옵션 을 사용하는 것입니다.

grep -wnr "yourString" .

cmd 프롬프트 또는 Windows 터미널에서 grep이라는 용어는 인식되지 않습니다
kouty

@kouty grep은 유닉스 명령입니다. itechtics.com/using-findstr-windows
Hugo M. Zuleta

1

디렉토리 내에서 다음 명령을 실행하십시오 (터미널). 하위 디렉토리 내부도 재귀 적으로 검사합니다.

grep -r 'your string goes here' * 

0

다음 샘플 재귀를 찾습니다 your search string에서 *.xml*.js폴더 내 파일에 위치한 곳 path1, path2하고 path3.

grep -r --include=*.xml --include=*.js "your search string" path1 path2 path3

따라서 파일의 서브 세트에서 많은 디렉토리를 검색 할 수 있으며 끝에 경로 만 제공 할 수 있습니다.


-4

grep을 사용하지 마십시오. Silver Searcher 또는 ripgrep을 다운로드 하십시오 . 그것들은 뛰어난 옵션으로 grep이나 ack보다 빠릅니다.


2
이것들은 훌륭한 도구 일 수도 있지만 OP가 요구하는 것을 달성하기 위해이 도구를 어떻게 사용할 것인지에 대한 대답은 아닙니다.
jmathew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.