![如何重命名扩展名略有不同的多个文件?](https://linux22.com/image/158021/%E5%A6%82%E4%BD%95%E9%87%8D%E5%91%BD%E5%90%8D%E6%89%A9%E5%B1%95%E5%90%8D%E7%95%A5%E6%9C%89%E4%B8%8D%E5%90%8C%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我有多个文件,它们都有类似的命名模式,例如:
{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
。所以,如果n
是foo.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
这--
是为了保护以下文件名,如果名称以破折号开头(--
表示命令行选项的结尾),则不会被意外识别为一组选项。