将文件重命名为md5值和扩展名(BASH)

7

我需要关于bash脚本的帮助。该脚本需要将目录中的所有文件重命名为其md5值+扩展名。

我找到了下面的bash脚本,但需要更改它以添加扩展名。

md5sum * | sed 's/^\(\w*\)\s*\(.*\)/\2 \1/' | while read LINE; do mv $LINE; done
3个回答

16

我会选择这种方法:

for F in $DIR/*.*; do
  mv "$F" "$(md5sum "$F" | cut -d' ' -f1).${F##*.}";
done

使用${F#*.}获取第一个句点之后的所有内容,例如tar.gz而不是gz(取决于您的要求)


OSX:for F in $DIR/*.*; do mv“$F”“$(md5“$F”| cut -d' ' -f4).${F##*.}”; done - Giacomo Pigani

16

这个可能适合你:

# mkdir temp && cd temp && touch file.{a..e}
# ls
file.a  file.b  file.c  file.d  file.e
# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/' | sh
`file.a' -> `d41d8cd98f00b204e9800998ecf8427e.a'
`file.b' -> `d41d8cd98f00b204e9800998ecf8427e.b'
`file.c' -> `d41d8cd98f00b204e9800998ecf8427e.c'
`file.d' -> `d41d8cd98f00b204e9800998ecf8427e.d'
`file.e' -> `d41d8cd98f00b204e9800998ecf8427e.e'

或者GNU sed甚至可以更加简短地完成:

# md5sum * | sed -e 's/\([^ ]*\) \(.*\(\..*\)\)$/mv -v \2 \1\3/e'

2
苹果/OSX 版本为:md5 * | sed -e 's/MD5 (\([^.]*\)\(.[^)]*\)) = \(.*\)$/mv -v "\1\2" \3\2/' | sh - fnl
如果您在OSX上有大量文件:ls -1 | while read file; do md5 "$file" | sed -e 's/MD5 (\(.*\)\(\.[^\d]*\)) = \(.*\)$/mv -v "\1\2" "\3\2"/' | sh ; done(这是从@fnl的版本扩展而来,以处理某些文件名中带有小数点的时间戳情况) - ggranum
此解决方案可能无法处理带有空格的文件名,请注意。我有一些文件在使用此解决方案时无法正常工作,它们都带有空格。 - Takase

0
find . -type f -exec mv \{\} "`md5sum \{\} | sed 's/ .*//'`.`echo \{\} | awk -v FS='.' '{print $NF}'\" 

或者这样也可以 :-). 实际上,我建议为find命令的文件名添加一个过滤器,因为它在没有.的文件名上会失败。

希望对你有帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接