如您所知,命令有一个选项find
,可让您判断您是在寻找“文件”还是“目录”。我想知道指定该选项是否会提高查找性能(速度)?例如:
find / -type file -name foo.bar
比
find / -name foo.bar
或者说这并没有什么区别?
答案1
是的,在某些情况下它确实提高了性能。
默认情况下,find
对其测试应用逻辑与,但是如果前者为假,则不会评估后者的测试。因此,如果你添加一个几乎总是在一开始就失败的超快测试,那么它可以节省许多后续(比如说:慢速)测试的执行,在这种情况下,这个额外的测试做提高性能。
进入包含许多文件和少量符号链接的目录。比较
time find -exec test -L {} \; -print
到
time find -type l -exec test -L {} \; -print
这是一个人为的但很有启发性的例子。两个测试(-type l
和-exec test -L {} \;
)执行相同的工作,两个find
命令产生相同的结果。但是-exec
会产生额外的进程,而且速度相对较慢。在我的主目录中,第一个命令需要两分钟;第二个命令需要六秒。
答案2
您的命令甚至不会起作用,原因有二:
起始目录(或多个目录)(如果有)必须始终出现在测试(如果有)之前,因此您的命令必须是
find / -name foo.bar …
一般来说你不能说
-type file
;应该是-type f
。
- 为什么你甚至会怀疑添加额外的测试会提高性能?
从理论上讲,它可以减少表现,因为你正在做
if (filename = "foo.bar" AND filetype = "f") print filename
代替
if (filename = "foo.bar") print filename
也就是说,你给它更多的工作要做。但实际上,差异可以忽略不计。
find
已经必须获取文件类型信息才能查看哪些条目是目录(因此需要递归搜索)。一旦它获得了这些信息,检查它是否是纯文件只需要几个 CPU 指令,而且速度非常快。