重命名多个文件可能的意外插值
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)
我正在使用 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)