文件树的文本规范?

时间:2008-12-26 21:52:48

标签: file tree grep glob

我正在寻找在树结构中指定文件的示例,例如,用于指定要在grep工具中搜索的文件集。我希望能够通过名称匹配来包含和排除文件和目录。我确信那里有例子,但我很难找到它们。

以下是可能语法的示例:

*.py *.html
*.txt *.js
-*.pyc
-.svn/
-*combo_*.js

(这意味着包含扩展名为.py .html .txt .js的文件,排除.pyc文件,.svn目录下的任何内容以及任何匹配 combo _ .js的文件)​​

我知道我以前在其他工具中看到过这些规格。这对任何人来说都响了吗?

7 个答案:

答案 0 :(得分:4)

此类事件没有单一的标准格式,但如果您想要复制广泛认可的内容,请查看rsync documentation。请查看“包含/排除模式规则”一章。

答案 1 :(得分:2)

Apache Ant提供'ant globs or patterns其中:

**/foo/**/*.java

表示“在目录中以'.java'结尾的任何文件,其目录中包含名为'foo'的目录” - 包括./foo/X.java

答案 2 :(得分:1)

在unixish环境中 find 怎么样?

查找当然可以做的不仅仅是构建文件列表,但这是它的常用方法之一。从手册页:

  

NAME        find - 遍历文件层次结构

     

概要        找到[-H | -L | -P] [-EXdsx] [-f pathname] pathname ...表达式        找到[-H | -L | -P] [-EXdsx] -f pathname [pathname ...] expression

     

说明        find实用程序以递归方式下降每个目录树        列出的路径名,评估表达式(由...组成)   根据树中的每个文件,primaries'' and操作数'列在下面。

为了实现你的目标,我会写一些类似的东西(格式化为可读性):

find ./ \( -name *.{py,html,txt,js,pyc} -or \
           -name *combo_*.js -or \
           \( -name *.svn -and -type d\)\) \
           -print

此外,还有一个使用 xargs 的idomatic模式,这使得find适合将如此构造的整个列表发送到任意命令,如下所示:

find /path -type f -print0 | xargs -0 rm

答案 3 :(得分:1)

在您的示例语法中,是否隐式理解存在转义字符,以便您可以显式包含以破折号开头的文件? (同样的问题适用于任何其他通配符,但我想我希望在名称中看到更多带有破折号的文件而不是星号。)

各种命令shell使用*(可能?匹配单个char),如示例所示,但它们通常只匹配不包含路径组件分隔符的字符串(即Windows上的'\')系统,'/'其他地方)。我也看到过像Perforce这样的源代码控制应用程序使用可以匹配路径组件分隔符的其他模式。例如,使用Perforce模式“foo / ... ext”(不带引号)将匹配以“ext”结尾的foo /目录结构下的所有文件,无论它们是在foo /本身还是在其中一个后代目录。这似乎是一种有用的模式。

答案 4 :(得分:1)

如果你正在使用bash,你可以使用extglob扩展来获得一些漂亮的globbing函数。启用它如下:

shopt -s extglob

然后你可以做以下事情:

# everything but .html, .jpg or ,gif files
ls -d !(*.html|*gif|*jpg)
# list file9, file22 but not fileit
ls file+([0-9])
# begins with apl or un only
ls -d +(apl*|un*)

另见this page

答案 5 :(得分:0)

find(1)是一个很好的工具,如前面的答案所述,但如果它变得更复杂,你应该考虑在任何常见的嫌疑人(Ruby,Perl,Python等)中编写自己的脚本或者尝试使用一个更强大的shell,比如zsh,它有一个** globbing命令,你可以指定要排除的东西。后者可能更复杂。

答案 6 :(得分:0)

您可能需要查看ack,这样您就可以使用--perl等选项指定要搜索的文件类型。

默认情况下,它还会忽略.svn个目录,以及核心转储,编辑器残留,二进制文件等。