Shell:除了一个子目录外,获取所有子目录中的文件通配符?

时间:2014-02-22 22:11:32

标签: directory wildcard glob subdirectory

我有一棵看起来像这样的树:

src/
├── engine/
├── python/
└── scenes/

我知道我可以使用ls src/**/*获取所有src个子目录中的文件列表,但我不想输出src/engine/目录中的任何文件。有没有简洁的方法可以从通配符中排除engine/

提前致谢。

1 个答案:

答案 0 :(得分:1)

我假设您正在使用Python,因为该问题包含对目录Python的引用。如果你不是,那么请忽略这个答案。

您可以在Python 2.6中使用Formic

从命令行,formic可以像这样使用来实现您的目标(假设您当前在/path/to/src

formic -e "/engine/**"

-e选项排除一个(或多个)Globs。在这种情况下,/engine/**会直接在当前工作目录中排除engine目录下的所有内容。

在Python中:

import formic
fileset = formic.FileSet(include="**", exclude="/engine/**", directory="/path/to/src")

Formic使用相对于工作目录的路径 - 这可能是src的父路径,但如果没有,我建议使用完全限定的路径。在上面的示例中,搜索从src开始,包含所有内容(**)。

Formic遵循Ant的规则,其中排除了一堆文件(例如Git / Mercurial / CVS / SVN工作目录)。您可以使用额外参数default_excludes=false关闭此行为。

您可以通过传递列表而不是字符串来指定多个包含和排除。

披露 - 我是此套餐的作者。