25

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

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

4

6 回答 6

26

在 Bash 4 中,shopt -s globstar您可以使用 with 和 zsh 来**/*包含除隐藏文件之外的所有内容。您可以shopt -s dotglob在 Bash 4 或setopt dotglobzsh 中执行以包含隐藏文件。

在 ksh 中,set -o globstar启用它。我认为没有办法隐式包含点文件,但我认为**/{.[^.],}*可行。

于 2010-12-03T19:37:32.850 回答
6

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

于 2010-12-03T20:27:40.497 回答
2

如果您想对 find 返回的所有文件进行操作,而不仅仅是列出它们,您可以将它们通过管道传递给 xargs:

find <directory> -type f | xargs ls

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

于 2010-12-03T19:41:16.507 回答
1

你可以试试:

**/*.*

但是它会忽略隐藏文件(例如.git文件)。有时它可以挽救生命。

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

于 2015-04-18T23:34:47.630 回答
0

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

tree <path>
于 2010-12-03T19:38:32.163 回答
0

vanilla Bash 没有办法做到这一点,但是大多数命令都接受一个-Ror--recursive选项来告诉它们进入目录。

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

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

find <directory> -type f
于 2010-12-03T19:26:33.000 回答