重命名 - 将文件名的 [ ] 分隔部分移动到文件名末尾

重命名 - 将文件名的 [ ] 分隔部分移动到文件名末尾

我一直在玩 cygwin 中重命名工具的 perl 实现,最终通过从 cpan 安装使其工作。

我已经很长时间没有玩这些东西了,所以我对我的正则表达式东西有点生疏了。

基本上我只是想重命名一堆表单的文件夹

[2022-10-10] This is a Test - This is a Test (some stuff) [393933939339]

或者

[2022] This is a Test - This is a Test (some stuff) [393933939339]

并将开头处的内容移至[]末尾,这样看起来就像

This is a Test - This is a Test (some stuff) [393933939339] [2022-10-10] 

或者

This is a Test - This is a Test (some stuff) [393933939339] [2022] 

我已经弄清楚如何使用位置参数来做到这一点,但我很难使用模式匹配来做到这一点[]

rename  -n 's/^(.{12})(.*)$/$2 $1/'

将为具有完整日期的文件夹执行此操作,显然,但不适用于仅包含一年的文件夹。理想情况下,我想要一个表达式来处理所有这些。

我认为这可能会因为 [] 被视为运算符而变得复杂,因此可能需要以某种方式转义。

任何帮助表示赞赏。

答案1

我认为这可能会因为 [] 被视为运算符而变得复杂,因此可能需要以某种方式转义。

正是如此。在 RE 中转义字符的标准方法是在其前面添加反斜杠\。所以,

rename -n 's/^(\[.*?])\s*(.*)/$2 $1/s' '['*

它一直受到推崇的应该包含模式替换的尾随s修饰符,因为这允许模式将换行符作为字符进行匹配(毕竟它们在文件名中是有效的)。另外,通过使用作为文件名模式,将考虑的文件集限制为可以转换的文件集(这会忽略以 开头的文件名-v等,这些文件名将由 shell 传递并作为有效参数选项进行处理);你也可以使用。rename'['*./*

答案2

我会做什么:

$ rename -n 's/^(\[.*?\])(.*)/$2 $1/' *393933939339*
rename([2022] This is a Test - This is a Test (some stuff) [393933939339],  This is a Test - This is a Test (some stuff) [393933939339] [2022])

正则表达式匹配如下:

节点 解释
^ 字符串锚点的开头
( 分组并捕​​获到 \1:
\[ [
.*? 除 \n 之外的任何字符(0 次或多次(匹配尽可能少的数量))
\] ]
) \1 结尾
( 分组并捕​​获到 \2:
.* 除 \n 之外的任何字符(0 次或多次(匹配尽可能多的数量))
) \2 结尾

相关内容