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

Abs*_*cDo 2 bash wildcards

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

$ ls **/* | wc -l
15
$ ls */** | wc -l
15
Run Code Online (Sandbox Code Playgroud)

它们输出相同的结果。

是否有任何区分**/**/**

Jef*_*ler 5

*/**只会匹配目录(及其子目录和文件);它不会匹配当前目录中的文件(非目录),因为*/它的一部分在开始**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)