find
찾아보고 싶은 파일 목록을 사용하고 가져오고 있습니다 grep
. 해당 목록을 어떻게 파이프합니까 grep
?
답변1
글쎄, stdout에 쓰는 모든 명령에 적용되는 일반적인 경우는 를 사용하는 것입니다. xargs
이를 통해 명령 끝에 원하는 수의 명령줄 인수를 추가할 수 있습니다.
$ find … | xargs grep 'search'
백틱을 사용하거나 grep
라인 에 명령을 삽입하면 $()
명령이 실행되고 출력이 대체됩니다.
$ grep 'search' $(find …)
\'"
파일 이름에 공백이나 다른 "이상한 문자"(xargs의 경우 \[*?
) 가 포함되어 있으면 이러한 명령이 작동하지 않습니다 $(find …)
.
그러나 특정 상황에서는 find
주어진 인수를 기반으로 프로그램을 실행하는 기능이 내장되어 있습니다.
$ find … -exec grep 'search' {} \;
-exec
와 사이의 모든 내용은 ;
실행될 명령입니다. {}
발견된 파일 이름으로 대체됩니다 find
. 이는 grep
각 파일에 대해 별도의 작업을 수행합니다. 여러 파일 이름을 가져와 모두 검색할 수 있으므로 find에 일치하는 모든 파일 이름을 한 번에 전달하도록 grep
변경할 수 있습니다 .;
+
grep
$ find … -exec grep 'search' {} \+
답변2
일부 버전 grep
(예: 내장되지 않은 Linux 또는BSD또는 Mac OS X) 재귀적으로 검색하는 옵션이 있습니다 -r
. OpenBSD에서는 -R
( --exclude
아래 예와 같이 사용하지 않고) 사용하세요. 여기 find
에는 및 의 간단한 조합이 포함됩니다 grep
.
구현에 해당 플래그가 없거나 -R
보다 고급 파일 일치 조건을 원하는 경우 -exec
main을 사용하여 find
실행하도록 할 수 있습니다 grep
. 일부 이전 구현은 ... find
을 지원하지 않습니다 . 이러한 시스템에서는 the 대신 a 를 사용하십시오 (이것은 파일당 한 번 호출되므로 속도가 느려지지만 그렇지 않은 경우 결과는 동일합니다). 단일 파일에서 호출될 때에도 파일 이름을 표시하는 트릭에 유의하십시오 (GNU grep 및 FreeBSD/NetBSD/OSX grep에는 동일한 효과를 얻을 수 있는 옵션이 있습니다).-exec
+
;
+
grep
/dev/null
grep
-H
find . -type f -name '*.o' -prune -o -exec grep 'needle' /dev/null {} +
grep -r --exclude='*.o' 'needle' .
답변3
find ... | while read line; do grep <regex> "$line"; done
답변4
예:
이름에 "Delay"가 있고 발견된 파일 어딘가에 "Create"가 있는 파일을 검색합니다.
find . | grep Delay | xargs grep 'Create'
그런 다음 뭔가가 발견되면 "Create"라는 단어가 적힌 모든 줄을 표시해야 합니다.