디렉터리에 있는 모든 *.txt 파일의 병렬 md5sum

디렉터리에 있는 모든 *.txt 파일의 병렬 md5sum

디렉터리에 있는 모든 파일의 md5 해시를 계산 하고 각 파일을 동일한 파일 이름 으로 *.txt저장하되 확장자를 ..txt.md5

파일의 경우: foo.txt 파일을 생성하고 싶습니다: foo.md5 내용:

9fa74bee342222aadd999b2e8b2bef62 *foo.txt

아래 명령을 사용하여 필요한 파일을 얻었지만 더 짧은 대안이 있는지 또는 적어도 하나 또는 두 개의 awk명령을 제거하는 방법이 있는지 궁금합니다.

time find *.txt | parallel md5sum | awk '{ print $1, $2, $2 }' | awk '{$1 $2 $3 > gsub(".txt", ".md5", $3); print}' | awk '{ print $1, "*"$2 > $3 }'

몇 가지 대안을 찾았지만 병렬성을 사용하지 않고 파일 이름을 바꾸는 대신 .md5를 파일 이름에 추가합니다. 그리고 md5 해시만 저장하므로 *filename수정이 필요합니다.

답변1

함수를 만들고 실행합니다 parallel.

_md5(){
  md5sum -b "$1" > "$1.md5"
}
export -f _md5

parallel -j8 _md5 ::: *.txt

"${1%.*}".md5확장자 md5를 추가하는 대신 교체 하는 데 사용됩니다 .

답변2

그리고 zsh:

autoload zargs
m5() md5sum < $1 > $1:r.md5
zargs -l1 -rP8 -- **/*.txt(ND.) -- m5

또는 GNU 유틸리티와 쉘을 사용하십시오:

LC_ALL=C find . -name '*.txt' -type f -print0 |
  xargs -r0 -l1 -P8 sh -c 'exec md5sum < "$1" > "${1%.*}.md5"' sh

관련 정보