我想将一些文件重命名为其内容的 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; }