【问题标题】:Fast way to find all dirs with a given glob查找具有给定 glob 的所有目录的快速方法
【发布时间】: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 毫秒),并告诉我是否需要进行更重的查找。

标签: linux bash shell


【解决方案1】:

我发现将这个查找的结果缓存在一个文件中,然后运行预查找以查看是否有任何目录比缓存新。

find .                      \
 -not \(                    \
     \(                     \
         -path ./vendor -o  \
         -path ./_\* -o     \
         -path ./.\* -o     \
         -path ./docs -o    \
         -path ./examples   \
     \) -prune              \
 \)                         \
 -type d                    \
 -newer ${CACHE}            \
 -print -quit               \
 | wc -l

如果返回“1”,那么我需要运行慢速路径。但大多数时候我不这样做,所以我可以使用缓存。

【讨论】:

    猜你喜欢
    • 2011-01-07
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多