使用shell globbing匹配所有嵌套目录下的所有文件

时间:2010-12-03 19:20:30

标签: linux bash shell

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

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

6 个答案:

答案 0 :(得分:21)

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

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

答案 1 :(得分:6)

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

答案 2 :(得分:2)

如果你想对find返回的所有文件采取行动,而不是仅列出它们,你可以将它们传递给xargs:

find <directory> -type f | xargs ls

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

答案 3 :(得分:0)

使用vanilla Bash无法做到这一点,但是大多数命令都接受-R--recursive选项来告诉他们进入目录。

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

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

find <directory> -type f

答案 4 :(得分:0)

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

tree <path>

答案 5 :(得分:0)

您可以尝试:

**/*.*

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

阅读更多信息:What expands to all files in current directory recursively? SO