这部分“ ( -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
(not -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 的评论导致了这一补充。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)