更快找到“找到”和“定位”的替代方案?


20

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


2
locate应该已经足够快了,考虑到它使用预先构建的索引(主要需要保持最新的警告),同时find必须阅读目录列表。
afrazier 2011年

2
您使用的是哪个?mlocate比slocate更快(请注意,无论你安装哪个软件包,命令仍然存在,请检查你的包管理器)
保罗

@benhsu,当我find /usr/src -name fprintf.c在我的OpenBSD台式机上运行时,它会在不到10秒的时间内返回这些源文件的位置。locate fprintf.c | grep '^/usr/src.*/fprintf.c$'在一秒钟内回来。什么是您的“长时间运行”你怎么使用的定义findlocate
Kusalananda 2011年

@Paul,我正在使用mlocate。
benhsu 2011年

@KAK,我想使用find / locate的输出在emacs中打开一个文件。我想到的用例是,我希望编辑文件,我将文件名(或一些与文件名匹配的正则表达式)键入emacs,emacs将使用find / locate来显示与之匹配的文件列表,所以我希望响应时间足够快,以便互动(1秒以内)。我在$ HOME中有大约300万个文件,我可以做的一件事是让我的find命令删除一些文件。
benhsu 2011年

Answers:


15

在项目中搜索源文件

使用更简单的命令

通常,项目的源可能在一个地方,也许在几个嵌套的子目录中不超过两个或三个深,所以你可以使用(可能)更快的命令,如

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

利用项目元数据

在C项目中,您通常有一个Makefile。在其他项目中,您可能会有类似的东西。这些可以是提取文件列表(及其位置)的快速方法,编写一个利用此信息定位文件的脚本。我有一个“sources”脚本,以便我可以编写命令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.

无需搜索

也许你正在寻找,因为你已经忘记了某些事情或未被告知的地方。在前一种情况下,写笔记(文档),在后者中,问?约定,标准和一致性可以帮助很多。


9

我使用了RedGrittyBrick的答案的“加速定位”部分。我创建了一个较小的db:

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

然后指出locatelocate -d /home/benhsu/ben.db


5

我使用的一种策略是将-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选项的存在暗示了这种可能性,但唉......


1
...因此执行“广度优先”搜索。
nobar 2015年

3

银色搜索者

你可能会发现它的搜索速度非常快有用内容的源代码文件数量巨大。只需输入ag <keyword>。这里有一些我的输出apt show silversearcher-ag

我经常使用它:

-G --file-search-regex PATTERN 仅搜索名称与PATTERN匹配的文件。

ag -G "css$" important

截图


1
ripgrep的 algorythm据称比silversearch更快,并且还接受.gitignore文件和跳跃.git.svn.hg...文件夹。
ccpizza

@ccpizza那么?Silver Searcher.gitignore默认也会尊重并忽略隐藏文件和二进制文件。还有更多的贡献者,更多的Github上的明星(14700 vs 8300)并且已经在市长发行的回购。请提供更新的可靠第三方来源比较。尽管如此,它ripgrep看起来很棒。
Pablo Bianchi

很高兴知道!我不ripgrep以任何方式与作者联系,它只符合我的要求所以我停止搜索其他选项。
ccpizza

银色搜索者.gitignore也很尊重。那说,rg绝对是惊人的。首先,它具有unicode支持。根据我的经验rg,至少是ag(YMMV)的两倍,我想这是由于Rust的正则表达式解析器,显然这些年来还没有准备好,这ag是新的。rg可以给出确定性输出(但默认情况下不会),它可以将ag只能列入白名单的文件类型列入黑名单,它可以根据大小忽略文件(再见日志)。我仍然使用ag以防万一我需要多行匹配,这rg是不可能的。
Pellmeister

2

另一个简单的解决方案是使用更新的扩展shell globbing。启用:

  • bash:shopt -s globstar
  • ksh:设置-o globstar
  • zsh:已启用

然后,您可以在顶级源目录中运行这样的命令:

# grep through all c files
grep printf **/*.c

# grep through all files
grep printf ** 2>/dev/null

这具有以下优点:它以递归方式搜索所有子目录并且非常快。


0

如需更换资料,请查看fd。它具有比原始查找命令更简单/更直观的界面,并且速度更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.