创建文件
touch a1.txt a2.txt a3.txt
touch s1.mp3 s2.mp3 s3.mp3
然后我做
find . -name "*.txt" -or -type f -print
而且它只显示s1.mp3
s2.mp3
s3.mp3
。为什么不显示.txt
文件?
创建文件
touch a1.txt a2.txt a3.txt
touch s1.mp3 s2.mp3 s3.mp3
然后我做
find . -name "*.txt" -or -type f -print
而且它只显示s1.mp3
s2.mp3
s3.mp3
。为什么不显示.txt
文件?
由于运算符的优先级:and之间的隐式AND (
-a
)比 OR ( ) 具有更高的优先级;你的命令类似于-type f
-print
-o
虽然你可能想要
打印所有文件。
优先级只是答案的一半。重要的是完成布尔表达式的规则如何工作。这很快就会变得有点复杂,主要是因为
find
使用了合理的默认值并且同时是可编程的。为了说明我的意思,这是另一个解决方案:
这为每个端点添加了显式操作。只是:
还获取所有文件(包括非常规的“p.txt”条目)。这里默认
-print
值在任何(子)表达式之外,并应用于所有分支。加完一个后
-print
,你会得到“要么...要么”:争论哪个更好是没有用的 - 问题是 Q 是非常人为的(而且也是重复的)。如果有人想追踪 a
mkfifo pipe.txt
,逻辑“与非”而不是“或”会更符合语义(和整体)意义。为此,您既不需要括号也不需要 -print: