로 find
:
cd /the/dir
find . -type f -exec grep pattern {} +
( 일반 파일 -type f
만 검색 합니다 ( 일반 파일을 가리키는 경우에도 심볼릭 링크 제외). 디렉토리를 제외한 모든 유형의 파일에서 검색하려는 경우 (하지만 fifos 또는 / dev / zero와 같은 일부 파일 유형은 당신은 일반적으로 (읽기를 원하지 않습니다), GNU- -type f
특정으로 대체하십시오 ! -xtype d
( symlink 확인 후 디렉토리-xtype d
유형의 파일과 일치합니다 )).
GNU로 grep
:
grep -r pattern /the/dir
(하지만 최신 버전의 GNU grep이 없으면 디렉토리로 내려갈 때 심볼릭 링크를 따라야합니다). -D read
옵션 을 추가하지 않으면 비정규 파일은 검색되지 않습니다 . 최신 버전의 GNU grep
는 여전히 심볼릭 링크를 검색하지 않습니다.
아주 오래된 GNU 버전은 find
표준 {} +
구문을 지원하지 않았지만 비표준을 사용할 수 있습니다.
cd /the/dir &&
find . -type f -print0 | xargs -r0 grep pattern
성능은 I / O 바운드 일 가능성이 높습니다. 검색을 수행하는 시간은 스토리지에서 모든 데이터를 읽는 데 필요한 시간입니다.
데이터가 중복 디스크 어레이에있는 경우 한 번에 여러 파일을 읽으면 성능이 향상 될 수 있습니다 (그렇지 않으면 성능이 저하 될 수 있음). 성능이 I / O 바운드가 아니고 (예를 들어 모든 데이터가 캐시에 있기 때문에) 여러 CPU가있는 경우 동시도 greps
도움이 될 수 있습니다. GNU xargs
의 -P
옵션으로 그렇게 할 수 있습니다 .
예를 들어, 데이터가 3 개의 드라이브가있는 RAID1 어레이에 있거나 데이터가 캐시에 있고 여유 시간이 3 개의 CPU가있는 경우 :
cd /the/dir &&
find . -type f -print0 | xargs -n1000 -r0P3 grep pattern
(여기서는 한 번에 최대 3 개의 파일을 동시에 실행하여 1000 개의 파일마다 -n1000
새로운 grep
파일 을 생성합니다 .)
그러나 출력 grep
이 리디렉션되면 3 개의 grep
프로세스 에서 잘못 인터리브 된 출력이 생겨서 다음과 같이 실행할 수 있습니다.
find . -type f -print0 | stdbuf -oL xargs -n1000 -r0P3 grep pattern
(최신 GNU 또는 FreeBSD 시스템에서) 또는 --line-buffered
GNU 옵션을 사용하십시오 grep
.
경우 pattern
고정 된 문자열 인의 추가 -F
옵션은 문제를 개선 할 수있다.
멀티 바이트 문자 데이터가 아니거나 해당 패턴이 일치하는 경우 데이터가 멀티 바이트 문자인지 여부는 중요하지 않습니다.
cd /the/dir &&
LC_ALL=C grep -r pattern .
성능을 크게 향상시킬 수 있습니다.
이러한 검색을 자주 수행하는 경우 많은 검색 엔진 중 하나를 사용하여 데이터를 색인화 할 수 있습니다.
find
과xargs
나grep -R