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

Dav*_*cek 3 command-line find

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

ter*_*don 7

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

find . \( -name foo -or -name bar -o -name baz \) -size +1M
Run Code Online (Sandbox Code Playgroud)

括号需要转义(\(\)不是(and )),因为括号是 shell 的特殊字符(它们用于在subshel​​ls 中运行命令),因此需要将它们转义以便传递给find而不是被“吃掉”贝壳。

上面的命令会发现其名称是任何的任何文件foobarbaz 其大小为> 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
Run Code Online (Sandbox Code Playgroud)

那里有两个名为 的文件foo,但只有一个大于 1M。有2个文件是> 1M的大小,但只有一个被命名为foobarbaz。因此,我希望上面的命令只会返回dir2/foo,事实上,它确实如此:

$ find . \( -name foo -or -name bar -o -name baz \) -size +1M
./dir2/foo
Run Code Online (Sandbox Code Playgroud)

好的,但是如果我不带括号运行它呢?

$ find .  -name foo -or -name bar -o -name baz  -size +1M
./dir2/foo
./dir1/bar
./dir1/foo
Run Code Online (Sandbox Code Playgroud)

这会为我找到所有已命名的foo文件bar、所有已命名bar 文件以及所有已命名且大小大于 1M 的文件。因此,即使它们的大小小于 1M ,也会返回barfooin dir1

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

他们在你的例子中做了什么我不知道,因为你实际上并没有给出一个工作命令作为例子。这将取决于是什么pattern。如果您真的在使用find . -ls,然后在括号中使用另一组测试,那么它们什么都不做,因为find . -ls已经匹配并列出了所有文件和目录。