这个命令会做什么:“find . -ls \( pattern \)”?

这个命令会做什么:“find . -ls \( pattern \)”?

我知道 find 命令的用途,但我不知道括号的用途。请解释一下。

答案1

这是一项功能find,可让您将不同的测试组合在一起。例如:

find . \( -name foo -or -name bar -o -name baz \) -size +1M

括号需要转义(\(and\)而不是(and)),因为括号是 shell 的特殊字符(它们用于在子壳层),因此它们需要进行转义才能被传递给findshell 而不被其“吃掉”。

上述命令将查找名称为foobar的任何文件baz 其大小 > 1M。现在以此目录结构为例:

$ ls -lh *
dir1:
total 2.0M
-rw-r--r-- 1 terdon terdon 1.0M Mar  7 01:24 bar
-rw-r--r-- 1 terdon terdon 1.0M Mar  7 01:24 foo

dir2:
total 4.0M
-rw-r--r-- 1 terdon terdon 2.0M Mar  7 01:24 file
-rw-r--r-- 1 terdon terdon 2.0M Mar  7 01:24 foo

那里有两个名为 的文件foo,但只有一个文件大小 >1M。 有两个文件大小 >1M,但只有一个文件名为foobarbaz。 因此,我预计上述命令只会返回dir2/foo,事实上确实如此:

$ find . \( -name foo -or -name bar -o -name baz \) -size +1M
./dir2/foo

好的,但是如果我不使用括号来运行它会怎么样?

$ find .  -name foo -or -name bar -o -name baz  -size +1M
./dir2/foo
./dir1/bar
./dir1/foo

它找到所有名为的文件foo、所有名为的文件bar和所有名为的文件bar 大小 > 1M。因此,即使大小 < 1M,也会返回和barfoodir1

因此,括号对于编写find组合不同测试集的命令非常有用。当与 find 的-or-and-not运算符结合使用时,它将成为一种非常强大的工具。

我无法判断它们在您的示例中做了什么,因为您实际上并没有给出一个有效的命令作为示例。这取决于具体情况pattern。如果您真的在使用find . -ls,然后在括号中使用另一组测试,那么它们什么也不做,因为find . -ls已经匹配并列出了所有文件和目录。

相关内容