이를위한 두 가지 쉬운 솔루션이 있습니다. 기본적으로, 사용 xargs또는 parallel.
xargs 접근법 :
당신은 사용할 수 있습니다 xargs으로 find다음과 같이 :
find . -type f -print0 | xargs -0 -P number_of_processes grep mypattern > output
number_of_processes시작하려는 최대 프로세스 수로 대체 할 위치입니다 . 그러나 이는 성능이 I / O 제한 인 경우 중요한 성능을 보장하지 않습니다. 이 경우 I / O 대기 시간 손실을 보상하기 위해 더 많은 프로세스를 시작하려고 할 수 있습니다.
또한 찾기를 포함하면 수정 시간 등과 같은 파일 패턴 대신 고급 옵션을 지정할 수 있습니다.
파일이 적 으면 Stéphane의 의견에 설명 된대로이 접근 방식의 한 가지 가능한 문제는 파일을 xargs충분히 처리하지 못할 수 있습니다. 한 가지 해결책은 -n옵션 을 사용하여 xargs한 번에 파이프에서 몇 개의 인수를 가져야 하는지를 지정하는 것입니다. 설정 -n1하면 xargs각 단일 파일에 대해 새 프로세스가 시작됩니다. 파일이 매우 커서 (이 질문의 경우와 같이) 비교적 적은 수의 파일이있는 경우 이는 바람직한 동작 일 수 있습니다. 그러나 파일 자체가 작 으면 새 프로세스를 시작하는 오버 헤드가 병렬 처리의 이점을 약화시킬 수 있으며,이 경우 더 큰 -n값이 더 좋습니다. 따라서 -n파일 크기 및 수에 따라 옵션이 미세 조정될 수 있습니다.
병렬 접근 :
또 다른 방법은 Ole Tange GNU Parallel 도구 parallel( 여기에서 사용 가능 )를 사용하는 것입니다. 이것은 병렬 처리에 대한 세밀한 제어를 제공하며 여러 호스트에 분산 될 수도 있습니다 (예를 들어, 디렉토리가 공유되는 경우 유리할 것임). 병렬을 사용하는 가장 간단한 구문은 다음과 같습니다.
find . -type f | parallel -j+1 grep mypattern
여기서 옵션 -j+1은 머신의 코어 수를 초과하여 하나의 프로세스를 시작하도록 병렬로 지시합니다 (I / O 제한된 작업에 도움이 될 수 있으며 더 많은 수를 시도 할 수도 있습니다).
Parallel은 또한 xargs각 프로세스의 출력 순서를 실제로 유지하고 연속적인 출력을 생성하는 것보다 이점이 있습니다. 예를 들어,을 사용하여 xargs프로세스 1이 say say p1L1를 생성하고 프로세스 2가 line을 생성하고 p2L1프로세스 1이 다른 line을 생성 p1L2하면 출력은 다음과 같습니다.
p1L1
p2L1
p1L2
반면 parallel출력은 다음과 같아야합니다.
p1L1
p1L2
p2L1
이것은 일반적으로 xargs출력 보다 유용 합니다.