【发布时间】:2016-07-17 16:37:58
【问题描述】:
我有以下sn-p的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
edit:这个目录树在数百个目录中有数千个文件。我希望找到 O(数百) 个匹配的目录。
任何聪明的想法,O shell 向导?
【问题讨论】:
-
你能用语言描述你在做什么吗?您的
find调用返回多少个结果? -
find的后续运行无论如何都会更快。另请查看 find 的查询优化选项。 -
并让我们了解您正在过滤的内容的规模。
find . -print0 | xargs -0 ls -l | wc -l的输出是什么? (或类似的)。如果您搜索 1000 多个文件,4-5 秒对我来说听起来不错。祝你好运。 -
编辑已添加。这个目录树在数百个目录中有数千个文件。我希望找到 O(数百) 个匹配的目录。
-
-O 没有任何效果,但我有一个想法来缓存结果,并对任何比缓存结果更新的目录进行初始查找。这非常快(50 毫秒),并告诉我是否需要进行更重的查找。