我想使用“查找”并找到“在我的项目中搜索源文件,但它们需要很长时间才能运行。是否有更快的替代方案,我不知道这些程序,或者加快性能的方法这些节目?
find /usr/src -name fprintf.c
在我的OpenBSD台式机上运行时,它会在不到10秒的时间内返回这些源文件的位置。locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
在一秒钟内回来。什么是您的“长时间运行”你怎么使用的定义find
和locate
?
我想使用“查找”并找到“在我的项目中搜索源文件,但它们需要很长时间才能运行。是否有更快的替代方案,我不知道这些程序,或者加快性能的方法这些节目?
find /usr/src -name fprintf.c
在我的OpenBSD台式机上运行时,它会在不到10秒的时间内返回这些源文件的位置。locate fprintf.c | grep '^/usr/src.*/fprintf.c$'
在一秒钟内回来。什么是您的“长时间运行”你怎么使用的定义find
和locate
?
Answers:
使用更简单的命令
通常,项目的源可能在一个地方,也许在几个嵌套的子目录中不超过两个或三个深,所以你可以使用(可能)更快的命令,如
(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.
也许你正在寻找,因为你已经忘记了某些事情或未被告知的地方。在前一种情况下,写笔记(文档),在后者中,问?约定,标准和一致性可以帮助很多。
我使用的一种策略是将-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
选项的存在暗示了这种可能性,但唉......
你可能会发现它的搜索速度非常快有用内容的源代码文件数量巨大。只需输入ag <keyword>
。这里有一些我的输出apt show silversearcher-ag
:
我经常使用它:
-G
--file-search-regex PATTERN
仅搜索名称与PATTERN匹配的文件。
ag -G "css$" important
.gitignore
默认也会尊重并忽略隐藏文件和二进制文件。还有更多的贡献者,更多的Github上的明星(14700 vs 8300)并且已经在市长发行的回购。请提供更新的可靠第三方来源比较。尽管如此,它ripgrep
看起来很棒。
ripgrep
以任何方式与作者联系,它只符合我的要求所以我停止搜索其他选项。
.gitignore
也很尊重。那说,rg
绝对是惊人的。首先,它具有unicode支持。根据我的经验rg
,至少是ag
(YMMV)的两倍,我想这是由于Rust的正则表达式解析器,显然这些年来还没有准备好,这ag
是新的。rg
可以给出确定性输出(但默认情况下不会),它可以将ag
只能列入白名单的文件类型列入黑名单,它可以根据大小忽略文件(再见日志)。我仍然使用ag
以防万一我需要多行匹配,这rg
是不可能的。
locate
应该已经足够快了,考虑到它使用预先构建的索引(主要需要保持最新的警告),同时find
必须阅读目录列表。