I am learning the wildcards recursive globbing and tried
$ ls **/* | wc -l 15 $ ls */** | wc -l 15 They output identical results.
Is there any distinction between **/* and */**?
*/** will only match directories (and their subdirectories & files); it will not match files (non-directories) in the current directory, because the */ portion of it requires a directory prefix before beginning the ** globstar expansion. As for **/*, the trailing /* is extraneous, since the ** will, by itself, expand to every file and directory under the current directory (subject to the dotglob option). Since every directory has been expanded by that point, the trailing /* does not match anything.
Be careful using ls to test, since it will "helpfully" read into any directories that you might pass it; consider instead something like:
printf "%s\n" */** printf "%s\n" **/* Also note that piping to wc -l could mislead you for actual counts; consider:
$ touch a $'b\nc' $ ls -1 a b?c $ ls | wc -l 3 ## WRONG! zsh (the original implementation of recursive globbing), ** alone is not special (it's the same as *), only **/ is (short for (*/)#). The API is different again in fish. See The result of ls * , ls ** and ls *** for details. ls **/* | wc -l issues can be worked around by using ls -qd -- **/* | wc -l