将文件名替换为其 md5 哈希



我有下一个文件列表:

 ~$: find . -type f -exec md5sum {} ;
 2a1731ae57fb17659b21f180f9fcbebd  ./temp.rd1
 f792fb6f13996a91d1ccbe2a8e3242fc  ./temp2.rd1
 f792fb6f13996a91d1ccbe2a8e3242fc  ./older1/temp.rd2
 b69997ffce70ec116b7f46eabdfc7040  ./older1/sub/temp.rd1
 d757a18d4a3c11c2a9a45e2f3815d3a1  ./older2/temp.rd3
 d79cc7e5f45852b79ddc896cc8e2b58c  ./older3/temp.rd3

左列包含右列中显示的文件的 md5 总和。我需要用下一个方式重命名文件:

 ./2a1731ae57fb17659b21f180f9fcbebd.rd1
 ./f792fb6f13996a91d1ccbe2a8e3242fc.rd1
 ./older/f792fb6f13996a91d1ccbe2a8e3242fc.rd2
 ./older/sub/b69997ffce70ec116b7f46eabdfc7040.rd1
 ./older2/d757a18d4a3c11c2a9a45e2f3815d3a1.rd3
 ./older3/d79cc7e5f45852b79ddc896cc8e2b58c.rd3

我正在尝试用 sed 完成此操作:

 sed -e 's/([^ ]*) (.*(..*))$/mv -v 2 13/e'

这会重命名文件,但路径中的目录会丢失,所以我正在寻找一种正确的方法来执行此操作(使用 sed 或 awk(。

这可能对你有用(GNU sed(:

sed -r 's|^s*(S+)s*((.(/[^/]*)*/)[^.]*(..*))|mv 2 315|e' file

使用反向引用重新排列每行,然后计算生成的命令。

:注:也许更安全的方法是删除e标志并在文件中捕获输出。然后在检查后将文件通过管道传输到外壳。

使用 awk 获得更简单的解决方案:

我为此作业创建了一个额外的.sh文件:

#!/bin/sh
MD5=$(md5sum "$1" | awk '{print $1'})
DIR=${1%/*}
FN=${1##*/}
EXT=${FN##*.}
if [ -n "$EXT" ]; then
    mv "$1" "$DIR/${MD5}.$EXT"
else
    mv "$1" "$DIR/${MD5}"
fi

保存它并chmod 777,然后您只需运行

find . -type f -exec rename-file.sh {} ;

最新更新