我可以成功使用以下命令,并且我对这个命令可以进行其他组合非常有信心:
rename 's/\.htm/\.html/' *.htm
但是我想了解更多关于它的信息,尤其是关于s
它的信息。他们说这是一个 Perl 表达式。我没有学过 Perl 编程语言,所以我不知道为什么会有这样的's/\.htm/\.html/'
争论。你能告诉我它是什么吗??谢谢阅读。
我可以成功使用以下命令,并且我对这个命令可以进行其他组合非常有信心:
rename 's/\.htm/\.html/' *.htm
但是我想了解更多关于它的信息,尤其是关于s
它的信息。他们说这是一个 Perl 表达式。我没有学过 Perl 编程语言,所以我不知道为什么会有这样的's/\.htm/\.html/'
争论。你能告诉我它是什么吗??谢谢阅读。
通常根据指定为命令的第一个参数的规则
rename
重命名提供的文件名。文件名由第一个后面的参数提供。示例命令 (
rename 's/\.htm/\.html/' *.htm
) 中的第一个参数具有毛皮部分,在本例/
中是这些部分的分隔符:该
s
命令意味着替代:s/<old>/<new>/
。将正则表达式与模式空间的内容相匹配。如果找到,用替换替换匹配的字符串。与应替换的字符串匹配的正则表达式。在当前情况下,这只是字符串
.htm
。在大多数正则表达式中,点
.
匹配每个字符。在这种情况下,我们想按字面意思使用点,因此我们需要通过使用反斜杠\
(引用单个字符)来转义它的特殊含义。替换匹配到 2 的 sting/regexp。
当前示例中未显示的标志。例如,它可能是标志
g
- 将替换应用于正则表达式的所有匹配项,而不仅仅是第一个。假设我们有一个名为的文件my.htm-file.htm
:原始命令
rename 's/\.htm/\.html/' *.htm
将以这种方式重命名文件:. 看看答案底部如何避免这个问题。my.html-file.htm
通过添加
g
标志 -rename 's/\.htm/\.html/g' *.htm
- 新文件名将是:.my.html-file.html
根据文件名:
*
可以表示任意数量的字符(包括零个,换句话说,零个或多个字符)。shell 将扩展该 glob,并将匹配的文件名作为单独的参数传递给rename
So*.htm
- 将匹配当前路径中以字符串结尾的所有文件名.htm
。例如,如果你有1.htm
,2.htm
,3.htm
,4.htm
,5.htm
然后rename 's/\.htm/\.html/' *.htm
传递完全相同的参数来重命名为运行:整个命令 (
rename 's/\.htm/\.html/' *.htm
) 可以这样读取:当我们有一个名为
my.htm-file.htm
. 可能我们想在最后一个点之后更改文件名的最后一部分,即所谓的扩展名。为此,我们应该rename
以这种方式修改命令:$
符号与行尾匹配的地方,字面意思是“向后阅读”。参考: