grep에 파일 목록을 전달하는 방법


98

사용 find하고 싶은 파일 목록을 사용 하고 grep있습니다. 이 목록을 grep어떻게 파이프 합니까?

답변:


116

stdout에 쓰는 모든 명령에서 작동하는 일반적인 경우는를 사용 xargs하여 명령 끝에 여러 명령 행 인수를 첨부 할 수 있습니다.

$ find … | xargs grep 'search'

또는 grepbackticks 또는를 사용하여 명령을 라인 에 포함 시키려면 명령을 $()실행하고 출력을 대체하십시오.

$ grep 'search' $(find …)

파일 이름에 공백이나 다른 "이상한 문자"( \'"xargs, \[*?for $(find …))가 포함되어 있으면 이러한 명령이 작동하지 않습니다 .


그러나 find특정 인수에서 프로그램을 실행할 수 있는 특정한 경우에는 내장 기능이 내장되어 있습니다.

$ find … -exec grep 'search' {} \;

사이에있는 모든 -exec;실행할 수있는 명령입니다; {}는에서 찾은 파일 이름으로 바뀝니다 find. grep각 파일마다 개별적 으로 실행 됩니다. 이후 grep여러 파일 이름을 가지고 그들 모두를 검색 할 수 있습니다, 당신은 변경할 수 ;하기 +에 일치하는 모든 파일 이름을 통과 찾을 알려 grep번 :

$ find … -exec grep 'search' {} \+

1
처음 두 형식은 공백이 포함 된 파일 이름과는 작동하지 않습니다.
enzotib

1
나는 선호한다 find ... -type f -print0 | xargs -r0 grep 'search' /dev/null. QED. -exec +매우 효율적 이지만 모든 버전의 find에 존재하지는 않습니다.
Arcege

슬프게도 나는 당신을 3 번 올바르게 확인할 수 없습니다.
Arcabard

3
을 사용하는 -exec대신을 (를) 사용하는 것이 좋습니다 xargs. -execin 을 사용 하면 컨텐츠 findgrep 하기 위해 하나의 쉘만 작성 합니다. 를 사용하면 xargs두 개의 셸이 만들어집니다. 하나는에 대한 find것과 다른 하나는에 대한 것 xargs입니다.

2
실험을 통해 $ find … -exec grep 'search' {} \+양식이 훨씬 빠릅니다.
gogoud

9

일부 버전 grep(예 : 내장되지 않은 Linux, BSD 또는 Mac OS X)은 -r재귀 검색을 수행 할 수있는 옵션이 있습니다. OpenBSD에서는 사용하십시오 -R( --exclude아래 예와 같은 것은 없습니다 ). find와의 간단한 조합을 다룹니다 grep.

구현에 -R플래그가 없거나 더 멋진 파일 일치 기준을 원할 경우 -exec기본 구현을 사용하여 find실행할 수 grep있습니다. 몇몇 오래된 find구현은 지원하지 않습니다 -exec+; 이러한 시스템에서는 ;대신 파일을 사용하십시오 +( grep파일 당 한 번 호출 하므로 속도가 느리지 만 결과는 동일합니다). 단일 파일에서 파일 이름이 호출 되더라도 파일 이름을 표시하게 하는 /dev/null트릭에 유의 grep하십시오 (GNU grep 및 FreeBSD / NetBSD / OSX grep은 -H동일한 효과를 얻을 수있는 옵션이 있습니다).

find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .

2
GNU grep-H항상 파일 이름을 인쇄하는 옵션을 선택합니다.
enzotib
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.