尝试进行批量重命名,无法找到正确的正则表达式

尝试进行批量重命名,无法找到正确的正则表达式

我正在尝试重命名我的电影收藏。目前所有文件都使用点而不是空格命名,例如 Men.in.Black.avi。我想用空格替换所有点,这并不难,但我需要保留最后一个点作为文件扩展名,例如 .avi、.mp4、.ogg 等。

我谷歌搜索没有找到解决方案。我也是一名 Javascript 开发人员,可以看到一些时髦的应用程序。所以,有什么建议吗?

答案1

一种方法是使用Perlrename实用程序。Perl 正则表达式\.(?=.*\.)仅当后面有另一个点时才会匹配一个点。

rename 's/\.(?=.*\.)/ /g' *.*.*

如果您还想对子目录中的文件进行操作:

shopt -s globstar    # you can put this in your ~/.bashrc
rename 's/\.(?=.*\.)/ /g' **/*.*.*

假设目录名称中没有点,则此方法有效。否则,我认为最简单的方法是使用find

find -depth -name '*.*.*' -exec rename 's/\.(?=.*\.)/ /g' {} +

或者,使用 zsh(由于(.)末尾的 glob 限定符,这只会重命名常规文件并保留目录名称):

autoload zmv    # you can put this in your ~/.zshrc
zmv -Q '(**/)(*.*)(.[^.]##)(.)' '$1${2//./ }$3'

答案2

在写这个问题时,我突然想到我还没有检查过 Ubuntu 软件中心。我找到了一个应用程序 pyRenamer,它出色地完成了我的任务。我最终将所有的点都改为空格,然后将所有以空格开头的文件扩展名(即“avi”、“mp4”、“ogg”)都改为用点代替空格。这不是最好的选择,因为可能会有一部电影的标题是 avi 或 ogg,这会非常麻烦,但这次它成功了。

我仍然对更简单的 RegEx 解决方案感兴趣。

答案3

cd $movielibrary
rename -n 's/\./ /g;s/ ([^ ]*$)/.$1/' *

看起来不错吧?重新运行最后一个不带 -n 的命令。

相关内容