답변:
stdout에 쓰는 모든 명령에서 작동하는 일반적인 경우는를 사용 xargs
하여 명령 끝에 여러 명령 행 인수를 첨부 할 수 있습니다.
$ find … | xargs grep 'search'
또는 grep
backticks 또는를 사용하여 명령을 라인 에 포함 시키려면 명령을 $()
실행하고 출력을 대체하십시오.
$ grep 'search' $(find …)
파일 이름에 공백이나 다른 "이상한 문자"( \'"
xargs, \[*?
for $(find …)
)가 포함되어 있으면 이러한 명령이 작동하지 않습니다 .
그러나 find
특정 인수에서 프로그램을 실행할 수 있는 특정한 경우에는 내장 기능이 내장되어 있습니다.
$ find … -exec grep 'search' {} \;
사이에있는 모든 -exec
및 ;
실행할 수있는 명령입니다; {}
는에서 찾은 파일 이름으로 바뀝니다 find
. grep
각 파일마다 개별적 으로 실행 됩니다. 이후 grep
여러 파일 이름을 가지고 그들 모두를 검색 할 수 있습니다, 당신은 변경할 수 ;
하기 +
에 일치하는 모든 파일 이름을 통과 찾을 알려 grep
번 :
$ find … -exec grep 'search' {} \+
find ... -type f -print0 | xargs -r0 grep 'search' /dev/null
. QED. -exec +
매우 효율적 이지만 모든 버전의 find에 존재하지는 않습니다.
$ 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' .
GNU grep
이 -H
항상 파일 이름을 인쇄하는 옵션을 선택합니다.