regex - 使用正则表达式通过/usr/bin/rename 重命名多个文件

标签 regex linux bash rename

我有很多 pdf 文件想要用 /usr/bin/rename 重命名。

文件按以下模式命名:

<rating> <a pretty long title> (<author> <year>).pdf
e.g.: +++ The discovery of some very interesting stuff (Dude 1999).pdf

rating: 1 to 5 '+' signs
year: numerical

它们应该重命名为以下模式:

<author>, <year> <rating> <a pretty long title>.pdf
e.g.: Dude, 1999 +++ The discovery of some very interesting stuff.pdf

我尝试使用/usr/bin/rename并编写了以下命令:

rename  's/(.*)\ (.*)\ \((.*)\ (.*)\).pdf/$3, $4 $1 $2.pdf/' *.pdf

但是,该命令并不认为评级始终包含“+”号并且年份始终为数字。我怎样才能实现这个目标?我尝试了类似 ([+]{1,5})([0-9]{4}) 的方法,但没有成功。

rename 实际上能够将 (.*) 以外的内容解释为变量 $1 ... $n 的输入吗?

感谢您的帮助!

最佳答案

这对我来说效果很好:

rename 's/(\+{1,5}) (.*) \((.*) ([0-9]{4})\).pdf/$3, $4 $1 $2.pdf/' -- \
    'Dude, 1999 +++ The discovery of some very interesting stuff.pdf'

...但是您的问题没有引用错误消息,因此很难判断您的情况可能出了什么问题。

作为警告,Linux 系统上广泛存在两个不同版本的 /usr/bin/rename,并且它们具有不同的语法。不过,我假设您使用的是 Perl,因为您原来的命令完全有效。这意味着您可以使用任何 Perl 表达式来修改名称 - 请参阅 perlre了解更多详情。

关于regex - 使用正则表达式通过/usr/bin/rename 重命名多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795400/

相关文章:

regex - 有没有一种有效的方法可以从 Postgres 中的列值中抓取子字符串?

linux - af_packet.ko 应该自动加载吗?

PHP fwrite 与输出管道

linux - 格式化 Masscan 输出

bash - 错误的尾部语法或 grep 命令?

bash ;删除一组后缀中的任何一个

C# Regex - 如何验证特定单词或数字但不是两者

c# - .NET 正则表达式如何匹配在特定位置不包含单词的字符串

python - 删除字符串中重复出现的正则表达式 - Python

c++ - 在 ubuntu 中使用 g++ 编译时,Open AL 的函数给出 undefined reference 的错误