2013-03-01 2 views
5

grep은 -r 옵션을 사용하여 재귀 적으로 검색 할 수 있습니다. 그러나, grep이 지정된 수의 하위 폴더 수준에 대해 쿼리 문자열을 재귀 적으로 검색 할 수 있는지 궁금합니다. 예를 들어, root 폴더에 parent1, parent2, ..., parentN 폴더가 있습니다. 각 상위 폴더에는 child1, child2, ..., childM이라는 일반 텍스트 파일과 폴더가 있습니다. 루트 수준에서 grep을 실행하고 하위 폴더를 보지 않고 부모 내부의 파일을 검색하고 싶습니다. 이 작업을 수행하는 간단한 방법이 있습니까?grep를 재귀 적으로 사용

그렙 :

+1

find/path/to/find -name "nameofthefile"또는 cat 각 파일을 다음과 같이하고 싶습니다. 문자열을 확인 하시겠습니까? –

답변

6

이러한을 시도 할 수 있습니다 당신이 수준을 정의 할 수 있습니다,

--exclude=GLOB 
       Skip files whose base name matches GLOB (using 
       wildcard matching). A file-name glob can use *, 
       ?, and [...] as wildcards, and \ to quote a wildcard 
       or backslash character literally. 

     --exclude-from=FILE 
       Skip files whose base name matches any of the file-name 
       globs read from FILE (using wildcard matching as 
       described under --exclude). 

     --exclude-dir=DIR 
       Exclude directories matching the pattern DIR from 
       recursive searches. 

또는 발견이 find | xargs grep

를 사용

편집

한 명령을 다른 명령으로 파이프 출력하는 것은 리눅스/유닉스 세계에서 매우 일반적입니다. 나는 당신이 매일 그것을 할 것입니다.

echo "abc"|sed 's/a/x/' 
find . -name "*.pyc" |xargs rm 
awk 'blahblah' file | sort |head -n2 
tree|grep 'foo' 
mvn compile|ack 'error' 
... 

위의 모든 예제가 효율적이지는 않습니다. 그들은 단지 예일뿐입니다.

+0

빠른 답변 감사합니다. 당신은 | 귀하의 모범을 상징합니다. 출력을 dest로 파이프하는 데 사용할 수는 있지만 출력을 다른 명령으로 파이프하는 것이 의미가 있다는 것을 이해하지 못합니다. 어쨌든, 나는 귀하의 솔루션을 시도하고 곧 귀하의 답변을 수락합니다. – Sal

+0

@Sal 답장, 더 많은 파이프에서 편집하십시오. – Kent

10

Kentnotes의 경우는 grep으로 입력 할 수 없습니다. 단순히 충분히 강력하지 않습니다. 트릭은 find을 사용하여 검색 할 파일을 결정하고 find이 생성하는 파일 목록을 grep으로 전달하는 것입니다.

당신이 man find를 실행하면

, 당신은 find 걸리는 많은 옵션의 man 페이지를 얻을 수 있습니다. 우리가 여기에 관심있는 것은 -maxdepth입니다.

필요한 명령을 작성해 봅시다. 그것이 어떻게 생겼는지보고 각 단계에서 명령을 실행

  • find . 현재 폴더 (.) 또는 하위 폴더에있는 모든 파일과 폴더를 나열합니다.

  • find . -maxdepth 1은 현재 폴더의 모든 파일과 폴더를 나열합니다. find . -maxdepth 2은 현재 폴더의 모든 파일과 폴더와 모든 즉각적인 하위 폴더를 나열합니다. 등등 ...

  • 우리는 폴더도 나열되어 있습니다. grep은 폴더 자체를 검색 할 수 없기 때문에 폴더의 파일 만 검색 할 수 있습니다. -type f을 추가하면 나열된 파일 만 가져옵니다 : find . -maxdepth 2 -type f.

이제 검색 할 파일을 알고 있으므로 grep을 검색해야합니다.이 작업을 수행하는 표준 방법은 xargs을 사용하고 있습니다 :

find . -maxdepth 2 -type f | xargs grep <text-to-search-for> 

|xarg의 "표준에"표준 출력 ", 일명"표준 출력 ", find에서 (즉, 당신이 일반적으로 화면에 표시되는 내용) 및 파이프 걸립니다 입력 ", 일명"표준 ", 즉 실행중인 프로그램에 타이핑 할 때 일반적으로 일어날 일.

xargs은 stdin에서받은 모든 인수를 추가 한 후 사용자가 여기 (grep <text-to-search-for>)로 알려주는 교활한 작은 프로그램입니다. 결과적으로 grepfind이 찾은 모든 파일을 검색합니다.

xargs 공간이 하나의 파일 이름 대신 두 개의 다른 파일 이름을 구분한다고 생각하기 때문에 일부 파일 이름에 공백이있는 경우에는 작동하지 않습니다. 이 문제를 해결할 수있는 방법이 많이 있습니다 (파일 이름에 공백을 사용하지 않는 것이 이상적입니다). 일반적인 것은 find이라는 멋진 기능 중 하나를 사용하는 것입니다.

find에 인수를 추가하면 ; 또는 +까지 지정한 모든 항목이 실행됩니다. {} (리터럴 문자 {})을 추가하면 모든 파일 목록으로 바뀝니다. find이 그렇게하고 있기 때문에 파일 이름의 공백이 파일 이름에 있어야한다는 것을 알고 있습니다. 따라서

당신이하려고하는 일을 할 수있는 가장 좋은 방법은 이렇게입니다 :

find . -type f -maxdepth 2 -exec grep <text-to-search-for> {} + 

(+;로 끝나는 사이의 차이는 여기에 차이가 없습니다 당신이 관심이 있다면이 man find에, 그러나. 짧은 버전은 +이 빠르지 만 명령에 {}을 하나만 가질 수 있다는 것을 의미합니다.)

관련 문제