이를위한 두 가지 쉬운 솔루션이 있습니다. 기본적으로, 사용 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
출력 보다 유용 합니다.