这是zmv
用一个下划线非递归地替换任意数量的空格的命令(感谢 Stéphane Chazelas,他帮助了我):
zmv -- '* *' '${f// ##/_}'
这是来自互联网的命令,它似乎做同样的事情,但是递归地:
zmv -- '(**/)(* *)' '$1${2//( #-## #| ##)/_}'
有人可以解释它是如何工作的吗?具体来说,该( #-## #| ##)
部分如何工作?
这是zmv
用一个下划线非递归地替换任意数量的空格的命令(感谢 Stéphane Chazelas,他帮助了我):
zmv -- '* *' '${f// ##/_}'
这是来自互联网的命令,它似乎做同样的事情,但是递归地:
zmv -- '(**/)(* *)' '$1${2//( #-## #| ##)/_}'
有人可以解释它是如何工作的吗?具体来说,该( #-## #| ##)
部分如何工作?
有两个区别:
some directory/some file
→some directory/some_file
)。foo bar
,foo - bar
,foo ---bar
全部映射到foo_bar
。foo-bar qux
映射到foo_bar_qux
.foo-bar
也会映射到foo_bar
,但它与模式不匹配。在第二个命令中,
(**/)(* *)
匹配当前目录下文件基本名称至少包含一个空格的所有路径。括号创建命名组,该组zmv
放置在位置参数中,因此目录部分(相当于$f:h/
)可用作$1
替换文本,而基本名称(相当于$f:t
)可用作$2
。请注意,该(**/)
组是一个例外:通常括号会关闭 的递归行为**
,但会进行特殊zmv
处理(**/)
。在替换中,
$1$2
将是原始名称(尾随/
是 的一部分$1
)。${2//…/_}
用下划线替换每一次出现的模式...。该模式( #-## #| ##)
使用“或”运算符:匹配可以是#-## #
(零个或多个空格、一个或多个破折号、零个或多个空格)的匹配,也可以是(一个或多个空格)的匹配##
。