`find -type l` 匹配文件,而 `-type l -o -type f` 不匹配,但仅与显式的 `-print`

`find -type l` 匹配文件,而 `-type l -o -type f` 不匹配,但仅与显式的 `-print`

我正在使用 GNU 的find.

我已将问题简化为这个 shell 会话:

$ mkdir t
$ cd t
$ touch a 
$ ln -s a b
$ find -type l
./b
$ find -type l -o -type f
./a
./b
$ find -type l -print
./b
$ find -type l -o -type f -print
./a

也许是因为我很困,但有两件事对我来说没有意义:

  • 不是吗true OR false == true?尽管匹配,但添加-o -type f会导致find停止匹配./b,这是怎么回事-type l
  • 手册页说这-print是默认表达式,那么当没有提及时会打印文件,而在提及时会省略文件,这是怎么回事呢?

使用时也会发生这种情况-printf(我实际需要的);我想其他表达方式也会受到影响。

答案1

find -type l -o -type f -print

您已指定操作,因此默认值不再适用。但-printf这里必然是-type f因为“and”的优先级高于“or”;你可以认为这相当于

find \( -type l \) -o \( -type f -print \)

要以相同的方式处理链接和文件,您需要对测试进行分组:

find \( -type l -o -type f \) -print

相关内容