在查找中对谓词进行分组

时间:2009-03-12 05:16:49

标签: find

这部分“(-name * txt -o -name * html)”让我对代码感到困惑:

find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn

有人可以解释括号和“-o”吗? “-o”是命令还是参数?我知道括号被“\”转义,但它们为什么用于?

3 个答案:

答案 0 :(得分:8)

默认情况下,查找参数列表中的条件是'和'在一起。 -o选项的意思是'或'。

如果你写了:

find $HOME -name \*txt -o -name \*html -print0

然后没有与文件名相关联的输出操作以'txt'结尾,因此不会打印它们。通过将名称选项与括号分组,您可以获得“html”和“txt”文件。


考虑一下这个例子:

mkdir test-find
cd test-find
cp /dev/null file.txt
cp /dev/null file.html

以下评论对此有一个有趣的侧面。如果命令是:

find . -name '*.txt' -o -name '*.html'

然后,由于没有为任何替代方案指定显式操作,因此默认-print(不是-print0!)操作用于两个备选方案,并且列出了两个文件。在其中一个备选方案(但不包括其他备选方案)之后使用-print或其他显式操作,则只有具有该操作的备选方案才会生效。

find . -name '*.txt' -print -o -name '*.html'

这也表明您可以针对不同的替代方案采取不同的行动。 您还可以应用其他条件,例如修改时间:

find . \( -name '*.txt' -o -name '*.html' \) -mtime +5 -print0

find . \( -name '*.txt'  -mtime +5 -o -name '*.html' \) -print0

第一个打印超过5天的txt或html文件(因此它不会为示例目录打印任何内容 - 文件只有几秒钟);第二个打印超过5天的txt文件或任何年龄的html文件(所以只是file.html)。等等...

感谢DevSolar对他的评论。

答案 1 :(得分:3)

“ - o”表示OR。即,名称必须以“txt”或“html”结尾。括号只是将两个条件组合在一起。

答案 2 :(得分:2)

(和)提供了一种为find命令分组搜索参数的方法。 -o是“或”运算符。

此find命令将查找以“txt”或“html”结尾的所有文件,并将这些文件作为参数传递给grep命令。