我可以成功使用以下命令,并且我对使用此命令进行其他组合非常有信心:
rename 's/\.htm/\.html/' *.htm
但是我想了解更多,尤其是关于s
它的内容。他们说这是一个 Perl 表达式。我没有学过 Perl 编程语言,所以我不知道为什么会有这样的's/\.htm/\.html/'
争论。你能告诉我它是什么吗?谢谢阅读。
答案1
一般来说rename
重命名文件名根据命令的第一个参数指定的规则提供。文件名由第一个参数之后的参数提供。
示例命令中的第一个参数 ( rename 's/\.htm/\.html/' *.htm
) 有毛皮部分,在本例中/
是这些部分的分隔符:
s/regexp/replacement/[flags]
该
s
命令表示替换:s/<old>/<new>/
。将正则表达式与模式空间的内容进行匹配。如果找到,则用替换替换匹配的字符串。与应替换的字符串匹配的正则表达式。在当前情况下,这只是字符串
.htm
。在大多数正则表达式中,点
.
与每个字符匹配。在这种情况下,我们想按字面意思使用点,因此我们需要使用反斜杠\
(引用单个字符)来转义其特殊含义。替换与 2 匹配的字符串/正则表达式。
当前示例中未显示的标志。例如,它可以是标志
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 将扩大该范围,并将匹配的文件名作为单独的参数传递给rename
So *.htm
- 将匹配当前路径中以字符串结尾的所有文件名.htm
。例如,如果您有1.htm
、2.htm
、3.htm
、4.htm
,5.htm
然后rename 's/\.htm/\.html/' *.htm
将完全相同的参数传递给 rename 运行:
rename 's/\.htm/\.html/' 1.htm 2.htm 3.htm 4.htm 5.htm
整个命令(rename 's/\.htm/\.html/' *.htm
)可以这样理解:
rename `<substitute>/<the string ".htm">/<with the string ".html">/` <do it for all files in the current path that end with ".htm">
让我们回到上面的例子,我们有一个名为的文件my.htm-file.htm
。我们可能想更改文件名的最后一部分,也就是最后一个点后面的扩展名。为此,我们应该rename
这样修改命令:
rename 's/\.htm$/\.html/' *.htm
该$
符号与行尾相匹配,字面意思是“向后读”。
^
- 匹配模式空间开头的空字符串,即,在脱字符之后出现的内容必须出现在模式空间的开头。(阅读更多)
^
\(
仅在正则表达式或子表达式的开头(即或之后)充当特殊字符\|
。但是,可移植脚本应避免^
在子表达式的开头使用它,因为 POSIX 允许^
在该上下文中将其视为普通字符的实现。
$
- 它与 相同^
,但指的是模式空间的结尾。也仅在正则表达式或子表达式的末尾(即或$
之前)充当特殊字符,并且它在子表达式末尾的使用是不可移植的。\)
\|
参考: