给定的是(子)目录中与字符串匹配的一组文件,例如:
find -name 'string' | sort
./1/2/3/4/string
./1/2/3/string
./1/2/string
./1/string
./string
为什么使用globstar
来匹配文件
ls **string
string
无法通过目录运行,而
ls **/string
1/2/3/4/string 1/2/3/string 1/2/string 1/string string
成功了吗?根据我对man
页面描述的理解,它应该匹配(子)目录,不是吗?
像这样的问题通常被标记为"The result of ls * , ls ** and ls ***" 的重复,但那里的答案只有 handle ls **
,它确实通过目录递归。似乎双星号后跟一个字符串会中断globstar
。
GNU bash v.4.4.19(1)
继续运行mint 19
从man bash
全球星
如果设置,路径名扩展上下文中使用的模式 ** 将匹配所有文件以及零个或多个目录和子目录。如果模式后跟 /,则只有目录和子目录匹配。
这也是它在 Ksh 和 Zsh 中的工作方式。
在模式匹配下,Bash 的手册说:
我想这可以理解为“单一模式”是由斜线分隔的部分,因此
foo/**/bar
它具有单一模式,但**bar
没有。不过,它可能会更清楚。
整个模式后面的斜杠使模式只匹配目录:
当不受(仅)限制时,双重
*
衰减为一的效果:*
/
任何不是 a
/
的前导或尾随字符都会导致**
衰减:这仅仅是因为路径名(作为文件名)不能包含任何
/
.a
*
无法扩展为包含 的名称/
。A**
有点相似,它会扩展为/
仅包含单独或由/
(不是任何其他字符/字符串)分隔的字符串: