这部分“(-name * txt -o -name * html)”让我对代码感到困惑:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
有人可以解释括号和“-o”吗? “-o”是命令还是参数?我知道括号被“\”转义,但它们为什么用于?
答案 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命令。