递归通配 **/* 和 */**

递归通配 **/* 和 */**

我正在学习通配符递归通配符并尝试过

$ 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!

相关内容