有比“查找”和“定位”更快的替代方法吗?

有比“查找”和“定位”更快的替代方法吗?

我想使用“查找”和“定位”来搜索项目中的源文件,但它们需要很长时间才能运行。是否有我不知道的更快的替代这些程序的方法,或者加快这些程序性能的方法?

答案1

在项目中搜索源文件

使用更简单的命令

一般来说,一个项目的源代码可能位于一个地方,可能位于几个嵌套不超过两三个深度的子目录中,因此您可以使用(可能)更快的命令,例如

(cd /path/to/project; ls *.c */*.c */*/*.c)

利用项目元数据

在 C 项目中,您通常会有一个 Makefile。在其他项目中,您可能会有类似的东西。这些可以快速提取文件列表(及其位置)编写一个脚本,利用此信息来定位文件。我有一个“源”脚本,这样我就可以编写类似 的命令grep variable $(sources programname)

加速查找

尽量少搜索,尽量少find / …find /path/to/project …。尽量简化选择标准。如果效率更高,可以使用管道来推迟某些选择标准。

另外,您可以限制搜索的深度。对我来说,这大大提高了“查找”的速度。您可以使用 -maxdepth 开关。例如“-maxdepth 5”

加快定位

确保它正在索引您感兴趣的位置。阅读手册页并使用适合您任务的任何选项。

   -U <dir>
          Create slocate database starting at path <dir>.

   -d <path>
          --database=<path> Specifies the path of databases to search  in.


   -l <level>
          Security  level.   0  turns  security checks off. This will make
          searchs faster.   1  turns  security  checks  on.  This  is  the
          default.

无需搜索

也许您搜索是因为您忘记了某样东西在哪里,或者没有人告诉您。在前一种情况下,请记下笔记(文档);在后一种情况下,请询问?惯例、标准和一致性会大有帮助。

答案2

我使用了 RedGrittyBrick 答案中的“加快定位速度”部分。我创建了一个较小的数据库:

updatedb -o /home/benhsu/ben.db -U /home/benhsu/ -e "uninteresting/directory1 uninteresting/directory2"

然后指着locate它说:locate -d /home/benhsu/ben.db

答案3

如需查找替代品,请查看自由度。它比原始的 find 命令具有更简单/更直观的界面,并且速度更快。

答案4

我使用的策略是应用-maxdepth以下选项find

find -maxdepth 1 -iname "*target*"

重复增加深度,直到找到您要找的东西,或者您厌倦了寻找。前几次迭代可能会立即返回。

这可以确保您不会浪费前期时间查看大量子树的深度,而您要查找的内容更有可能位于层次结构的底部附近。


下面是一个自动化此过程的示例脚本(当您看到所需内容时按 Ctrl-C):

(
TARGET="*target*"
for i in $(seq 1 9) ; do
   echo "=== search depth: $i"
   find -mindepth $i -maxdepth $i -iname "$TARGET"
done
echo "=== search depth: 10+"
find -mindepth 10 -iname $TARGET
)

请注意,所涉及的固有冗余(每次传递都必须遍历前几次传递中处理的文件夹)将主要通过磁盘缓存进行优化。

为什么不find将此搜索顺序作为内置功能?可能是因为如果您认为冗余遍历是不可接受的,那么实现起来会很复杂/不可能。该-depth选项的存在暗示了这种可能性,但可惜……

相关内容