我正在学习通配符递归通配符并尝试过
$ ls **/* | wc -l
15
$ ls */** | wc -l
15
他们输出相同的结果。
**/*
和之间有什么区别吗*/**
?
答案1
*/**
只会匹配目录(及其子目录和文件);它不会匹配当前目录中的文件(非目录),因为*/
它的部分在开始 globstar 扩展之前需要目录前缀**
。至于**/*
,尾随/*
是无关的,因为它**
本身会扩展到当前目录下的每个文件和目录(取决于选项dotglob
)。由于此时每个目录都已扩展,因此尾随/*
不匹配任何内容。
小心使用ls
测试,因为它会“有帮助地”读取进入您可能会传递的任何目录;考虑类似:
printf "%s\n" */**
printf "%s\n" **/*
另请注意,管道 towc -l
可能会误导您的实际计数;考虑:
$ touch a $'b\nc'
$ ls -1
a
b?c
$ ls | wc -l
3 ## WRONG!