4

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

下面是一个可能的语法示例:

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

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

我知道我以前在其他工具中看到过这类规范。这是否为任何人敲响了警钟?

4

7 回答 7

4

这种东西没有单一的标准格式,但如果你想复制被广泛认可的东西,请查看rsync文档。查看“包含/排除模式规则”一章。

于 2008-12-27T01:01:29.833 回答
2

Apache Ant提供了'ant glob 或模式,其中:

**/foo/**/*.java

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

于 2008-12-26T23:06:58.160 回答
1

find在unixish环境中怎么样?

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

NAME find -- 遍历文件层次结构

概要找到 [-H | -L | -P] [-EXdsx] [-f 路径名] 路径名 ... 表达式查找 [-H | -L | -P] [-EXdsx] -f 路径名 [路径名 ...] 表达式

描述 find 实用程序递归地向下遍历每个列出的路径名的目录树,根据树中的每个文件评估一个表达式(由 primaries'' and下面列出的操作数组成)。

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

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

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

find /path -type f -print0 | xargs -0 rm
于 2008-12-26T22:06:25.630 回答
1

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

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

于 2008-12-26T23:10:37.170 回答
1

如果您使用 bash,则可以使用extglob扩展来获得一些不错的通配函数。按如下方式启用它:

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*)

另请参阅此页面

于 2008-12-27T01:14:28.480 回答
0

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

于 2008-12-26T22:17:50.193 回答
0

您可能想查看ack,它允许您使用诸如--perl等选项指定要搜索的文件类型。

它还.svn默认忽略目录,以及核心转储、编辑器、二进制文件等。

于 2008-12-27T00:51:46.250 回答