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
。
echo -n "$i" | md5sum
– 计算包含文件扩展名 ( Piping )的完整文件名的md5 总和,将扩展名更改剥离为以下之一:echo -n "$i"
${i%%.*}
sed 's/\..*//' <<< "$i"
echo "$i" | sed 's/\..*//'
Run Code Online (Sandbox Code Playgroud)sum=$(…)
– 执行…
并保存输出$sum
(命令替换)
${sum%% *}
– 输出所有内容,直到第一个空格(Parameter Substitution),与以下之一相同:
$(sed 's/ .*//' <<< "$sum")
$(echo "$sum" | sed 's/ .*//')
Run Code Online (Sandbox Code Playgroud)${i##*.}
– 输出最后一个点之后的所有内容(参数替换),与以下之一相同:
$(sed 's/.*\.//' <<< "$i")
$(echo "$i" | sed 's/.*\.//')
Run Code Online (Sandbox Code Playgroud)如果您需要递归重命名不同文件夹中的文件,请使用find
该-exec
选项。
#!/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 哈希,然后原始文件名将无法恢复,除非您仔细记录每次运行脚本后调用的文件。
随着perl
的rename
:
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
高兴时删除 )。