代码之家  ›  专栏  ›  技术社区  ›  SaiKiran

用bash中的md5哈希字符串替换文件的完整文件名

  •  1
  • SaiKiran  · 技术社区  · 8 年前

    问题:

    我在一个文件夹中有一堆文件,我想将它们重命名为文件内容的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.
    

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Inian    8 年前

    通过使用shell提供的glob模式,而不是使用诸如 find . 另见 Why you don't read lines with "for"

    在文件夹中导航 /home/admin/test 做以下应该足够的事情

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

    尝试使用 echo 代替 mv 首先检查文件是否按预期重命名。

    要转到下面的子目录(我认为这也是您的要求),请启用 globstar ,这是shell提供的扩展全局选项之一

    shopt -s globstar
    for file in **/*; do
    
        2
  •  1
  •   oliv    8 年前

    如果要使用MD5哈希递归重命名所有文件,可以尝试以下操作:

    find /home/admin/test -type f -exec bash -c 'md5sum "$1" | while read s f; do mv "${f#*./}" "$(dirname ${f#*./})/$s"; done' _ {} \;
    

    哈希和文件名作为参数提供给 s f 变量。这个 ${f#*./} 删除由添加的前缀 md5sum find 命令。

    注意,如果某个文件有完全相同的内容,它将只得到一个文件。