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