로 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-bufferedGNU 옵션을 사용하십시오 grep.
경우 pattern고정 된 문자열 인의 추가 -F옵션은 문제를 개선 할 수있다.
멀티 바이트 문자 데이터가 아니거나 해당 패턴이 일치하는 경우 데이터가 멀티 바이트 문자인지 여부는 중요하지 않습니다.
cd /the/dir &&
LC_ALL=C grep -r pattern .
성능을 크게 향상시킬 수 있습니다.
이러한 검색을 자주 수행하는 경우 많은 검색 엔진 중 하나를 사용하여 데이터를 색인화 할 수 있습니다.
find과xargs나grep -R