这部分“ ( -name *txt -o -name *html ) ”在代码中让我感到困惑:
find $HOME \( -name \*txt -o -name \*html \) -print0 | xargs -0 grep -li vpn
有人可以解释括号和“-o”吗?“-o”是命令还是参数?我知道括号是由 "\" 转义的,但是为什么要使用它们呢?
这部分“ ( -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 的评论导致了这一添加。
“-o”表示或。即,名称必须以“txt”或“html”结尾。括号只是将这两个条件组合在一起。
( 和 ) 提供了一种对 find 命令的搜索参数进行分组的方法。-o 是“或”运算符。
此 find 命令将查找所有以“txt”或“html”结尾的文件,并将它们作为参数传递给 grep 命令。