将目录中的所有文件重命名为其文件名(非内容)的 md5 哈希值

Bra*_*adH 11 command-line rename mv

我对 linux / 命令行非常陌生,需要加密 10K+ 文件的名称(唯一名称),以便它们与 mySQL 数据库中的 MD5 加密名称匹配。
我已经看到了如何重命名文件目录以及如何获取文件的哈希值(mdsum?),但我一直坚持如何获取文件名的哈希值,然后将该文件重命名为生成的哈希值保留扩展即

mynicepicture.jpg > fba8255e8e9ce687522455f3e1561e53.jpg 
Run Code Online (Sandbox Code Playgroud)

似乎它应该是一个简单的重命名或mv行,但我无法理解它。
非常感谢您的见解

PS 我已经在几个接近我正在寻找的例子中看到了 Perl 函数的使用,但不知道在哪里/如何使用它们。

des*_*ert 14

你没有说你想使用哪个 shell,所以我只是假设Bash - 答案需要调整以与其他 shell 一起工作。

for i in *; do sum=$(echo -n "$i"|md5sum); echo -- "$i" "${sum%% *}.${i##*.}"; done
Run Code Online (Sandbox Code Playgroud)

脚本版本:

for i in *; do
  sum=$(echo -n "$i" | md5sum)
  echo -- "$i" "${sum%% *}.${i##*.}"
done
Run Code Online (Sandbox Code Playgroud)

这个简单的for循环获取当前目录中的每个文件,计算其名称的 md5 总和并输出它。如果你想开始重命名替换第二使用此检查的功能,echo通过mv

说明

如果您需要递归重命名不同文件夹中的文件,请使用find-exec选项。


Kus*_*nda 6

#!/bin/bash

md5name () {
    local base=${1##*/}
    local ext=${base##*.}
    local dir=${1%/*}

    printf '%s' "${base%.$ext}" | md5sum |
    awk -v dir="$dir" -v ext="$ext" '{ printf("%s/%s.%s\n", dir, $1, ext) }'
}

dir=$HOME  # where your files are

for pathname in "$dir"/*; do
    test -f "$pathname" || continue
    echo mv "$pathname" "$( md5name "$pathname" )"
done
Run Code Online (Sandbox Code Playgroud)

bash脚本使用md5sum来自 GNU coreutils的实用程序从任何给定路径名的基本名称(无扩展名)计算 MD5 哈希值。辅助函数md5name进行实际计算,并将输出具有完整路径和扩展名的新名称。

md5name函数用于awk从给定路径名的各部分组装新名称,并从md5sum.

单独使用的函数示例:

$ md5name '/some/path/file name here.extension'
/some/path/c9e89fa443d16da4b96ea858881320c9.extension
Run Code Online (Sandbox Code Playgroud)

...c9e89fa443d16da4b96ea858881320c9字符串的 MD5 哈希值在哪里file name here

echo从顶部的脚本中删除以实际重命名文件。echo如果您在某些时候需要将文件名恢复为原始文件名,您可能希望将原始脚本的输出保存到文件中(使用原位)。

请注意,在一组文件上运行两次将计算 MD5 哈希的 MD5 哈希,然后原始文件名将无法恢复,除非您仔细记录每次运行脚本后调用的文件。


Sté*_*las 5

随着perlrename

find . -name '*.jpg' -type f -exec rename -n '
  BEGIN{use Digest::MD5 qw(md5_hex)}
  my ($dir, $name, $ext) = m{(.*)/(.*)\.(.*)}s;
  $_ = "$dir/" . md5_hex($name) . ".$ext"' {} +
Run Code Online (Sandbox Code Playgroud)

-n高兴时删除 )。