![如何将多个文件重命名为其内容的 MD5 和?](https://linux22.com/image/73178/%E5%A6%82%E4%BD%95%E5%B0%86%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E9%87%8D%E5%91%BD%E5%90%8D%E4%B8%BA%E5%85%B6%E5%86%85%E5%AE%B9%E7%9A%84%20MD5%20%E5%92%8C%EF%BC%9F.png)
我想将一些文件重命名为其内容的 MD5 和;例如,如果文件foo
为空,则应将其重命名为d41d8cd98f00b204e9800998ecf8427e
.
它必须是脚本还是我可以使用类似rename
工具的东西?
答案1
格伦的回答很好;这是多个文件的改进:
md5sum file1 file2 file3 | # or *.txt, or whatever
while read -r sum filename; do
mv -v "$filename" "$sum"
done
如果您要生成find
或类似的文件,则可以将调用替换md5sum
为类似的内容find . <options> -print0 | xargs -0 md5sum
(输出也通过管道传输到 shell 循环中)。
这是获取 的输出md5sum
,该输出由多行和一个 sum 组成,然后是它对应的文件,并将其输送到一个 shell 循环中,该循环读取每一行并发出一个mv
命令,将文件从原始名称重命名为 sum。任何具有相同金额的文件将被覆盖;但是,除非出现异常情况(例如您正在处理 md5 哈希冲突),否则这意味着它们具有相同的内容,因此您无论如何都不会丢失任何数据。如果需要对每个文件引入其他操作,可以将它们放入循环中,引用变量$filename
和$sum
,其中分别包含原始文件名和 MD5 和。
答案2
和zsh
:
autoload zmv # best in ~/.zshrc
zmv '**/*(#qD.)' '$(md5sum<$f)'
将递归地重命名所有常规文件。
(请注意,如果同一目录中的两个文件具有相同的校验和,它将拒绝重命名任何文件,添加-f
以覆盖它)。
**/*(#qD.)
iszsh
的带有 glob 限定符的递归 glob (其显式形式为(#q<qualifiers>)
,D
包括隐藏文件,.
仅选择常规的文件。
答案3
重击:
md5sum my.file.here | { read sum filename; mv $filename $sum; }