有没有办法使用shell Globbing来识别嵌套目录?
所以,如果我有dir / dir1 / dir2 / dir3 / dir4 / dir5 / ..并且我有所有文件,那么匹配所有目录下所有文件的等效globbing模式是什么,类似于 - 例如 - ls -R
答案 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