我发现了很多关于如何使用命令行重命名多个文件的问题。但是我无法解决重命名此文件名的具体问题:
something_4M_something_something_manyothersomethings.csv
进入这个:
something_4_M_something_something_manyothersomethings.csv
我需要的是将4M
字段拆分为4_M
但我无法做到(注意:每件事都用下划线分隔,还有很多其他字段,我相信这对任务并不重要)。
我所做的是以下,但它不像我预期的那样工作我认为这是正则表达式的问题,但我想不出一个更好的:
rename -n 's/.4M/$&_4_M/' *
另外,我不知道我写的东西到底是如何工作的,因为我在与类似问题之一的评论中发现了类似的东西,但我再也找不到了。
如果您真正想做的只是替换
4M
为4_M
,那么您的正则表达式的变体会这样做:正则表达式适用于名称中的任何内容,因此您无需执行特定操作来保持领先的“某事”。
如果您想做其他事情,例如将第一个“某事”移动到第二个“某事”,或限制为
4M
下划线后的第一次出现,请编辑您的问题并澄清。正如评论中所观察到的那样,
-n
进行了试运行,因此它显示了会发生什么,并且实际上并没有执行操作。由于问题中的示例已经在使用
-n
,因此我假设提问的人理解了这一点。使用 Raku(以前称为 Perl_6)
对于单个文件:
对于多个文件:
目录输入:
目录输出(多文件重命名):
警告:先备份!!
简要说明(单个文件重命名):
dir()
使用正则表达式匹配(“副词”)选项获取感兴趣的文件列表test => / ... /
,并且只取一个元素([0]
),将其存储在标量变量$name
中。检查这个变量表明它是一个.IO
对象。使用熟悉的
S///
习惯用法来修改given $name
变量,并将修改后的名称存储为$modname
. 注意这里,S///
字符串化,所以.IO
方法调用被添加到末尾,S///
所以它$modname
也是一个.IO
对象。在正则表达式中,一个不熟悉的符号可能是
<(…)>
符号。但这只是 Raku 的捕获标记S///
,因此在识别左半部分的整个匹配时,仅捕获4M
内部的匹配<(…)>
,并在右半部分进行修改S///
。如果获得了所需的开始/结束
.IO
对象,则该行($name,$modname).say;
应产生类似于以下内容的输出:一旦一切看起来都不错,您可以取消注释
rename()
Raku 代码的最后一行,以便将倒数第二行中列出的文件实际重命名为.say
.注意:
createonly => True
在上面的代码中包含副词/选项rename()
意味着rename()
不会破坏现有的文件名(较短的形式:createonly
做同样的事情)。删除createonly => True
or:createonly
副词/选项以获得默认值(False
,即破坏)并允许重命名(覆盖)预先存在的文件/文件名。https://docs.raku.org/syntax/S$SOLIDUS$SOLIDUS$SOLIDUS
https://docs.raku.org/routine/rename
https://raku.org