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

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

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보다 고급 파일 일치 조건을 원하는 경우 -execmain을 사용하여 find실행하도록 할 수 있습니다 grep. 일부 이전 구현은 ... find을 지원하지 않습니다 . 이러한 시스템에서는 the 대신 a 를 사용하십시오 (이것은 파일당 한 번 호출되므로 속도가 느려지지만 그렇지 않은 경우 결과는 동일합니다). 단일 파일에서 호출될 때에도 파일 이름을 표시하는 트릭에 유의하십시오 (GNU grep 및 FreeBSD/NetBSD/OSX grep에는 동일한 효과를 얻을 수 있는 옵션이 있습니다).-exec+;+grep/dev/nullgrep-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"라는 단어가 적힌 모든 줄을 표시해야 합니다.

관련 정보