将所有嵌套目录下的所有文件与shell匹配

有没有办法使用shell Globbing来识别嵌套的目录?

所以如果我有dir / dir1 / dir2 / dir3 / dir4 / dir5 / ..并且我拥有所有这些文件,那么匹配所有目录下的所有文件的等效匹配模式是什么,类似于 – 例如 – ls -R

在Bash 4中,可以使用**/* ,除了隐藏文件以外,其他所有内容都可以使用。 您可以在Bash 4中使用shopt -s dotglob ,或者在zsh中setopt dotglob以使隐藏文件包含在内。

在ksh中, set -o globstar启用它。 我不认为有一种隐式包含点文件的方法,但我认为**/{.[^.],}*起作用。

特别是关于git(gitignore,gitattributes和带文件名的命令):如果模式不包含斜线, *通配符将匹配较深。 如果它包含一个斜杠, git将调用fnmatch和FNM_PATHNAME标志,简单的通配符将不匹配斜线。 **不匹配深不支持。 也许这种深度匹配可以更广泛地支持一个新的FNM_STARSTAR标志,并在glibc,gnulib和其他地方实现。

如果你想对查找返回的所有文件执行操作,而不是只列出它们,你可以将它们传递给xargs:

 find <directory> -type f | xargs ls 

但是这只适用于没有递归标志的命令。

您可以使用树,它会递归地显示所有文件夹。

 tree <path> 

用香草Bash没有办法做到这一点,然而大多数命令都接受-R或 – --recursive选项来告诉它们进入目录。

如果您只想列出目录或其子目录中任何位置的所有文件,则可以使用find 。

用给定的目录递归地查找文件( -type f ):

 find <directory> -type f 

你可以尝试:

 **/*.* 

但是它会忽略隐藏的文件(如.git文件)。 有时候这是一个救命恩人。

阅读更多: 什么扩展到当前目录中的所有文件递归? 在SO