확실하지 않습니다 :
grep -r -i 'the brown dog' /*
정말 당신이 의미하는 것입니다. 이것은 숨겨지지 않은 모든 파일과 디렉토리에서 재귀 적으로 grep을 의미합니다 /
(그러나 여전히 숨겨진 파일 내부와 디렉토리 내부를 살펴보십시오).
당신이 의미한다고 가정 :
grep -r -i 'the brown dog' /
몇 가지 참고할 사항 :
- 모든
grep
구현이 지원되는 것은 아닙니다 -r
. 디렉토리 트리를 탐색 할 때 일부는 디렉토리에 대한 심볼릭 링크를 따릅니다 (즉, 동일한 파일에서 여러 번 보거나 무한 루프로 실행될 수 있음). 일부는 장치 파일 내부를 /dev/zero
보거나 (예를 들어 꽤 오랜 시간이 걸릴 것입니다 ) 파이프 또는 이진 파일 ... 일부는 그렇지 않습니다.
grep
파일을 발견하자마자 파일 내부를 조사 하기 시작하는 것이 효율적 입니다. 그러나 파일을 찾는 동안 더 이상 검색 할 파일을 더 이상 찾지 않습니다 (대부분의 경우와 마찬가지로)
너의:
find / -type f -exec grep -i 'the brown dog' {} \;
파일 당 -r
하나를 실행하기 때문에 (여기서 의미가없는 제거 )는 비효율적 grep
입니다. ;
하나의 인수 만 허용하는 명령에만 사용해야합니다. 또한 여기에서는 grep
하나의 파일 만 보이 므로 파일 이름이 인쇄되지 않으므로 일치하는 위치를 알 수 없습니다.
장치 파일, 파이프, 심볼릭 링크를 보지 않고 심볼릭 링크를 따르지 않지만 여전히 잠재적으로 내부를 살펴보고 있습니다 /proc/mem
.
find / -type f -exec grep -i 'the brown dog' {} +
grep
가능한 적은 명령이 실행 되기 때문에 훨씬 나을 것입니다. 마지막 실행에 파일이 하나만 있지 않으면 파일 이름을 얻게됩니다. 이를 위해서는 다음을 사용하는 것이 좋습니다.
find / -type f -exec grep -i 'the brown dog' /dev/null {} +
또는 GNU grep
:
find / -type f -exec grep -Hi 'the brown dog' {} +
참고 grep
때까지 시작되지 않습니다는 find
이에 씹어 때문에 일부 초기 지연이있을 것이다 충분한 파일을 발견했다. 그리고 find
이전 grep
으로 돌아올 때까지 더 많은 파일을 계속 검색하지 않습니다 . 큰 파일 목록을 할당하고 전달하면 약간의 영향을 미치므로 grep -r
symlink를 따르거나 장치 내부를 보지 않는 것보다 효율성이 떨어질 수 있습니다.
GNU 도구로 :
find / -type f -print0 | xargs -r0 grep -Hi 'the brown dog'
위와 grep
같이 가능한 적은 인스턴스가 실행되지만 find
첫 번째 grep
호출이 첫 번째 배치 내부를 찾는 동안 더 많은 파일을 계속 찾습니다. 그러나 이점이 될 수도 있고 아닐 수도 있습니다. 예를 들어 회전식 하드 드라이브에 저장된 데이터 find
와 grep
디스크의 다른 위치에 저장된 데이터에 액세스하면 디스크 헤드가 지속적으로 이동하여 디스크 처리량이 느려집니다. 는 RAID 설정에서 (여기서 find
와 grep
다른 디스크에 액세스 할 수 있습니다) 또는 SSD를에, 그 긍정적 인 변화를 만들 수 있습니다.
RAID 설정에서 여러 개의 동시 grep
호출을 실행 하면 상황이 개선 될 수도 있습니다. 여전히 3 개의 디스크가있는 RAID1 스토리지의 GNU 도구
find / -type f -print0 | xargs -r0 -P2 grep -Hi 'the brown dog'
성능이 크게 향상 될 수 있습니다. 그러나 두 grep
번째 grep
명령 은 첫 번째 명령 을 채우는 데 충분한 파일이 발견 된 후에 만 시작 됩니다. 더 빨리 발생 하도록 -n
옵션을 추가 할 수 있으며 호출 xargs
당 더 적은 파일을 전달할 수 있습니다 grep
.
또한 xargs
출력을 터미널 장치 이외의 것으로 리디렉션하는 경우 greps
s가 출력을 버퍼링하기 시작 하므로 s의 출력 grep
이 잘못 인터리브 될 수 있습니다. 그 문제를 해결하기 위해 stdbuf -oL
(GNU 또는 FreeBSD와 같이 사용 가능한 경우) 그것들 을 사용해야 하거나 (여전히 긴 줄에 문제가있을 수 있습니다 (일반적으로 4KiB 이상)) 각각 별도의 파일로 출력을 작성하고 연결해야합니다 결국.
여기서 찾고있는 문자열은 고정되어 있지 않으므로 (regexp가 아님) -F
옵션을 사용하면 차이가 발생할 수 있습니다 ( grep
구현물이 이미 최적화하는 방법을 알고 있지는 않음 ).
큰 차이를 만들 수있는 또 다른 것은 멀티 바이트 로캘 인 경우 로캘을 C로 고정하는 것입니다.
find / -type f -print0 | LC_ALL=C xargs -r0 -P2 grep -Hi 'the brown dog'
내부보고 피하려면 /proc
, /sys
..., 사용 -xdev
당신이 검색 할 파일 시스템 및 지정
LC_ALL=C find / /home -xdev -type f -exec grep -i 'the brown dog' /dev/null {} +
또는 명시 적으로 제외하려는 경로를 정리하십시오.
LC_ALL=C find / \( -path /dev -o -path /proc -o -path /sys \) -prune -o \
-type f -exec grep -i 'the brown dog' /dev/null {} +