Match all files under all nested directories with shell globbing

a 夏天 提交于 2019-12-03 01:22:59

In Bash 4, with shopt -s globstar, and zsh you can use **/* which will include everything except hidden files. You can do shopt -s dotglob in Bash 4 or setopt dotglob in zsh to cause hidden files to be included.

In ksh, set -o globstar enables it. I don't think there's a way to include dot files implicitly, but I think **/{.[^.],}* works.

Specifically about git (gitignore, gitattributes, and commands that take filenames): if the pattern contains no slash, * wildcards will match deep. If it does contain a slash, git will call fnmatch with the FNM_PATHNAME flag, and simple wildcards won't match slashes. ** to match deep isn't supported. Maybe this kind of deep matching could be more widely supported with a new FNM_STARSTAR flag, and an implementation in glibc, gnulib and other places.

If you want to act on all the files returned by find, rather than just list them, you can pipe them to xargs:

find <directory> -type f | xargs ls

But this is only for commands that don't have a recursive flag.

kenorb

You may try:

**/*.*

However it'll ignore hidden files (such as .git files). Sometimes it's a life-saver.

Read more at: What expands to all files in current directory recursively? at SO

You can use tree, it will show all folders recursively.

tree <path>
meagar

There is no way to do this with vanilla Bash, however most commands accept a -R or --recursive option to tell them to descend into directories.

If you simply want to list all files located anywhere within a directory or its sub-directories, you can use find.

To recursively find files (-type f) with a given directory:

find <directory> -type f
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!