我正在使用 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