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