此部分 “(-name * TXT -o -name * HTML)” 混淆了我的代码:

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

有人能解释括号和“O”?是“O”命令或参数?我知道支架是由“\”逃过一劫,但他们为什么呢?

有帮助吗?

解决方案

默认情况下,在查找参数列表中的条件“AND关系结合在一起。所述-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!)用于两种替代动作和两个文件都被列出。与备选之一(而不是其他)后<=>或其它明确动作,则只有与动作替代生效。

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文件(所以它不输出任何的示例目录 - 文件是几秒钟旧);第二打印txt中比任何年龄(所以只是file.html)的5天或HTML文件旧文件。等等...

感谢DevSolar对他的评论导致这种加法。

其他提示

在 “-o” 的意思OR。即,名称必须以“TXT”或“HTML”结束。括号只是组的两个条件一起。

在(和)提供了一种方法用于查找命令组搜索参数。所述-o是一个 “或” 操作符。

此找到命令会发现在名为“txt”或“HTML”结尾的所有文件,并通过那些作为参数传递给grep命令。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top