查找所有包含特定通配符的目录的快速方法

3

我有以下的shell代码片段:

find .                          \
     -not \(                    \
         \(                     \
             -path ./vendor -o  \
             -path ./_\* -o     \
             -path ./.\* -o     \
             -path ./docs -o    \
             -path ./examples   \
         \) -prune              \
     \)                         \
     -type f -name \*.go        \
     | sed 's|^./||'            \
     | xargs -n1 dirname        \
     | sort -u                  \

这段代码是有效的,但运行需要4-5秒钟。 我正在寻找加快速度的方法。任何只包含一个*.go文件的目录都符合要求。输出必须仅为目录名称,并且必须是dir/subdir而不是./dir/subdir

编辑:这个目录树中有成千上万个文件和数百个目录。 我预计会找到与之匹配的数百个目录。

有什么聪明的想法吗,O shell 魔法师?


find 的后续运行无论如何都会更快。此外,还应查看 find 的查询优化选项。 - sjsam
请提供您正在过滤的规模。find . -print0 | xargs -0 ls -l | wc -l 的输出是什么?(或类似命令)。如果您要搜索数千个文件,4-5秒对我来说听起来不错。祝好运。 - shellter
编辑添加。这个目录树有成千上万个文件,分布在数百个目录中。我预计会找到O(数百)个匹配的目录。 - Tim Hockin
++回复,(现在想起来)这是一个中等复杂的“查找”和一个很好的 shell 管道的很好例子!如果你计时每个元素,那么“查找”将使管道的其余部分优化相形见绌。生命短暂,赶快行动吧;-)祝好运。 - shellter
1
-O 没有效果,但我有一个想法可以缓存结果并进行初始遍历,查找任何比缓存结果更新的目录。这非常快速(50毫秒),并告诉我是否需要执行更重的查找操作。 - Tim Hockin
显示剩余6条评论
1个回答

0
我发现在文件中缓存此查找结果,然后运行一个预查找来查看是否有任何目录比缓存更新,会显著提高速度。
find .                      \
 -not \(                    \
     \(                     \
         -path ./vendor -o  \
         -path ./_\* -o     \
         -path ./.\* -o     \
         -path ./docs -o    \
         -path ./examples   \
     \) -prune              \
 \)                         \
 -type d                    \
 -newer ${CACHE}            \
 -print -quit               \
 | wc -l

如果返回值是“1”,那么我需要运行慢速路径。但大多数情况下,我可以使用缓存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接