Find 命令输出没有给出期望的结果

Find 命令输出没有给出期望的结果

创建文件

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

相关内容