这部分"(-name*txt -o -name*html)"让我对代码感到困惑:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
有人可以解释括号和"-o"吗?"-o"是命令还是参数?我知道括号被"\"转义,但为什么它们适合?
默认情况下,查找参数列表中的条件是'和'在一起.该-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对他的评论.