如何重命名扩展名略有不同的多个文件?

如何重命名扩展名略有不同的多个文件?

我有多个文件,它们都有类似的命名模式,例如:

{filename}.jpeg{random number}

我想重命名这些文件,使其扩展名为 .jpeg。我怎样才能做到这一点?

答案1

如果你有 Larry Wall 的 perl 重命名

rename 's/[.]jpeg[0-9]*/.jpeg/' *.jpeg[0-9]*

如果您只有 Util-Linux 重命名则不起作用。

您可以在 bash 中使用 for 循环

for n in *.jpeg[0-9]*
do mv -i "$n" "${n%%.jpeg[0-9]*}.jpeg"
done

${var%%pattern}是一个标准参数扩展扩展为 的值var,并删除(最长的)尾随部分匹配pattern。所以,如果nfoo.jpeg123${n%%.jpeg[0-9*}就是foo。 (foo.jpeg1abc也会导致foo。)

答案2

我建议在执行之前使用zsh' ,zmv这样可以防止潜在的冲突(例如当前目录中同时存在 afile.jpeg1和文件)file.jpeg2任何改名。

zsh

autoload zmv # best in ~/.zshrc
zmv -n '(*.jpeg)<->' '$1'

其中<-><x-y>此处匹配的数字范围无边界)匹配任何十进制数字序列,与 相同[0-9]##

(高兴时删除-n以进行空运行)。

答案3

假设每个名称中只有一个子.jpeg字符串,并且您希望使用标准 shell 循环删除该子字符串之后的所有内容(无论它是数字还是其他字符串):

for name in *.jpeg*; do
    mv -i -- "$name" "${name%.jpeg*}.jpeg"
done

参数替换将从 的值中${name%.jpeg*}删除及其后面的任何内容。然后,我们将该字符串添加到该替换的结果中以创建新的文件名。.jpeg$name.jpeg

该位将以这样的方式mv -i --调用:在覆盖现有名称之前会要求确认。mv--是为了保护以下文件名,如果名称以破折号开头(--表示命令行选项的结尾),则不会被意外识别为一组选项。

相关内容