기준: 여러 다이제스트(md5, sha256)를 동시에 계산하시겠습니까?
SHA256 해시를 계산하려는 파일이 많은 폴더가 있습니다.
나는 세그먼트를 코딩하곤 했습니다:
#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done
현재 sha256 해시를 병렬로 계산하고 있습니다. 단, 내 컴퓨터에는 물리적 코어가 16개만 있습니다.
그렇다면 제 질문은 GNU 병렬을 사용하여 어떻게 실행할 수 있느냐는 것입니다. 단, 시스템에서 사용 가능한 16개의 물리적 코어만 사용하고 해시가 완료되면 자동으로 다음 파일 해시를 선택합니까?
답변1
GNU를 사용하면 parallel
쉘 루프를 완전히 피하고 다음을 실행할 수 있습니다.
parallel -P 16 sha256sum {} ">"{}.sha ::: *
이는 sha256sum
glob에서 반환된 모든 파일(또는 디렉터리, 그러나 스크립트가 수행하는 작업)에서 실행 되고 *
출력을 fileName.sha
.
$ ls
file1 file2 file3 file4 file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1 file2 file3 file4 file5
file1.sha file2.sha file3.sha file4.sha file5.sha
하지만 @Kusalandanda를 기억해주세요.지적이런 종류의 병목 현상의 주요 원인은 I/O이지 반드시 CPU는 아닙니다. 16개 미만을 병렬로 실행하는 것이 좋습니다.
답변2
다음을 사용합니다(및 를 지원하는 xargs
이 유틸리티가 구현 되어 있다고 가정).-0
-P
printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh
그러면 현재 디렉토리의 모든 이름이 에 전달됩니다 xargs
. 유틸리티는 이러한 각 이름에 대해 xargs
인라인 스크립트를 호출하여 최대 16개의 동시 프로세스를 시작합니다. sh
인라인 스크립트는 인수를 받아들이고 sha256sum
실행하여 결과를 비슷한 이름의 파일로 출력합니다.
.sha
이는 동일한 파이프라인의 이전 실행에서 생성된 파일을 선택할 수도 있습니다 . 이를 방지하려면 *
다루고 있는 특정 이름보다 더 복잡한 glob을 사용하십시오. 예를 들면 다음과 같습니다 bash
.
shopt -s extglob
printf '%s\0' !(*.sha) | xargs ...as above...
또한 sha256sum
대용량 파일을 병렬로 실행하는 것은 CPU 바인딩이 아닌 디스크 바인딩일 수 있으며 더 적은 수의 병렬 작업으로도 유사한 작동 속도를 볼 수 있습니다.
GNU에 해당하는 경우 로 parallel
바꾸십시오 .xargs
parallel
zsh
쉘 에서는 할 수 있습니다
autoload -U zargs
setopt EXTENDED_GLOB
zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh