6

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

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

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

4

3 回答 3

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 的评论导致了这一添加。

于 2009-03-12T05:44:32.057 回答
3

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

于 2009-03-12T05:21:30.850 回答
2

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

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

于 2009-03-12T05:22:27.290 回答