首页 > 解决方案 > 用 bash 中内容的 MD5 哈希字符串替换文件的完整文件名

问题描述

问题:

我在一个文件夹中有一堆文件,我想将它们全部重命名为文件内容的 md5。

我尝试了什么:

这是我尝试过的命令。

for i in $(find /home/admin/test -type f);do mv $i $(md5sum $i|cut -d" " -f 1);done

但这在一段时间后因错误而失败,只有一些文件被重命名,其余部分保持不变。

mv: missing destination file operand after /home/admin/test/help.txt
Try `mv --help' for more information.

实施是否正确?我在脚本中做错了什么吗?

标签: bashshellmd5

解决方案


通过使用 shell 提供的 glob 模式而不是使用外部实用程序(如find. 另请参阅为什么您不阅读带有“for”的行

在文件夹内导航/home/admin/test并执行以下操作就足够了

for file in *; do
    [ -f "$file" ] || continue
    md5sum -- "$file" | { read sum _; mv "$file" "$sum"; }
done

尝试使用echoinplace of mvfirst 检查文件是否按预期重命名。

要转到下面的子目录,我认为这也是您的要求, enable globstar,这是 shell 提供的扩展全局选项之一,可以更深入

shopt -s globstar
for file in **/*; do

推荐阅读