![对目录中的所有 *.txt 文件进行并行 md5sum](https://linux22.com/image/205642/%E5%AF%B9%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%20*.txt%20%E6%96%87%E4%BB%B6%E8%BF%9B%E8%A1%8C%E5%B9%B6%E8%A1%8C%20md5sum.png)
尝试计算*.txt
目录中所有文件的 md5 哈希值并将每个文件存储在相同的文件名中,但将扩展名替换为.txt
to .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 实用程序和任何 shell:
LC_ALL=C find . -name '*.txt' -type f -print0 |
xargs -r0 -l1 -P8 sh -c 'exec md5sum < "$1" > "${1%.*}.md5"' sh