重命名多个文件可能的意外插值

rename multiple files possible unintended interpolation

我正在使用 brew rename 重命名多个文件...

file-24.png => file.png
file-48.png => file@2x.png
file-72.png => file@3x.png

第一个成功了,

rename 's/-24//g' *

第二个和第三个...

rename 's/-48/@2x/g' *

并获得 Possible unintended interpolation of @2 in string at (eval 2) line 1...

转义不起作用..

rename 's/-48/\@2x/g' *

也欢迎像这种情况一样重命名多个文件的其他可能方法..

我不知道“brew rename”是什么,但如果它使用正常的正则表达式

's/pattern/q(@replacement)/e'

这里使用/e modifier to evaluate the replacement side as code, where q() operator(单引号)用于插入文字字符。

另一种方法是对 @ 个字符使用 \x40

's/pattern/\x40replacement/'

或者只是转义它,在替换中使用 \@

适合只有一个字符需要处理的情况,比如这里。如果不止于此,那么使用 q() (为此我们需要 /e 标志)对整个内容进行单引号会更容易。


忍不住问 -- 您确定要在文件名中包含 @ 吗?许多工具以各种方式解释该角色。例如,将该文件名粘贴到 Perl 脚本的变量中会导致无穷无尽的麻烦。为什么不直接 file_at_2x.png?

这可能更让人好奇,但如果你有很多文件,你可以将它们全部重命名为

's{ \-([0-9]+) }{ ($r = /24) > 1 && qq(_at_${r}x) || q() }ex'

这会将数字 ([0-9]+) 捕获到 </code> 中。然后,它找到比率 (<code>$r = /24),如果是 >1,则 (&& 短路) 它用 _at_${r}x 替换 -number,否则 (||) 通过放置一个空字符串 q().

来删除它

我使用 {}{} 分隔符,以便我可以在内部使用 /,而 }x 允许在内部使用空格,以便于阅读。

请一如既往地使用您的实际文件(副本)仔细测试。

我知道这个问题很老,也许 apt-get 安装的 rename 版本略有不同或有所改进。然而,用一个反斜杠转义似乎可行:

$ rename -n -v 's/-48/\@2x/g' *
rename(foo-48.txt, foo@2x.txt)