grep에 파일 목록을 전달하는 방법 하고 grep있습니다. 이 목록을

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



답변

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' {} \+


답변

일부 버전 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' .


답변