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

kar*_*ina 2 perl rename

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

file-24.png => file.png
file-48.png => file@2x.png
file-72.png => file@3x.png
Run Code Online (Sandbox Code Playgroud)

第一个是成功的,

rename 's/-24//g' *
Run Code Online (Sandbox Code Playgroud)

第二个和第三个……

rename 's/-48/@2x/g' *
Run Code Online (Sandbox Code Playgroud)

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

逃避是不行的..

rename 's/-48/\@2x/g' *
Run Code Online (Sandbox Code Playgroud)

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

zdi*_*dim 5

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

's/pattern/q(@replacement)/e'
Run Code Online (Sandbox Code Playgroud)

这使用/e 修饰符将替换侧评估为代码,其中q() 运算符(单引号)用于插入文字字符。

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

's/pattern/\x40replacement/'
Run Code Online (Sandbox Code Playgroud)

或者只是逃避它,\@在替换中使用。

这适用于只有一个角色需要处理的情况,就像这里一样。如果有更多内容,那么用q()(为此我们需要/e标志) 单引号整个内容会更容易。


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

这可能更奇怪,但如果您有很多文件,您可以使用以下命令重命名它们

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

这会将数字捕获([0-9]+)$1. 然后,它找到比率 ( $r = $1/24),如果是,>1则(&&短路)将其替换-number_at_${r}x,否则 ( ||) 通过放置空字符串 来删除它q()

我使用{}{}分隔符,以便可以/在内部使用,并}x允许内部有空格,以提高可读性。

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