特别是使用Baloo查看Dolphin,即使您正在执行简单的文件名搜索,它似乎也在其搜索域中查找每个文件的元数据。当我跟踪该file.so
过程时,我看到了对的调用lstat
,getxattr
并getxattr
再次对每个文件甚至..
条目进行了调用。这些系统调用检索有关文件的元数据,该元数据与文件名存储在不同的位置(文件名存储在目录内容中,但元数据在inode中)。多次查询文件的元数据是便宜的,因为数据将存储在磁盘缓存中,但是查询元数据和不查询元数据之间可能会有很大的不同。
find
更聪明。它试图避免不必要的系统调用。它不会调用,getxattr
因为它不会基于扩展属性进行搜索。当遍历目录时,它可能需要调用lstat
不匹配的文件名,因为它可能是要递归搜索的子目录(lstat
是系统调用,它返回文件元数据,包括文件类型,例如常规/目录/符号链接/…)。但是find
有一个优化:它从链接数中知道一个目录有多少个子目录,并且lstat
一旦知道遍历所有子目录就停止调用。特别是在叶目录(没有子目录的目录)中,find
仅检查名称,不检查元数据。此外,某些文件系统在目录条目中保留文件类型的副本,因此,如果这是唯一需要的信息,find
则甚至不需要调用lstat
它。
如果find
使用需要检查元数据的选项运行,它将进行更多lstat
调用,但是lstat
如果不需要信息,它仍然不会对文件进行调用(例如,由于先前条件排除了文件,匹配名称)。
我怀疑其他重新发明find
轮子的GUI搜索工具比经过数十年优化的命令行实用程序同样不那么聪明。至少,如果您“无处不在”搜索,Dolphin至少足够聪明,可以使用定位数据库(其限制在UI中尚不明确,结果可能已过时)。