快速查找具有给定glob的所有dirs的方法

时间:2016-07-17 16:37:58

标签: linux bash shell

我有以下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(数百个)匹配的目录。

任何聪明的想法,O shell向导?

1 个答案:

答案 0 :(得分: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”,那么我需要运行慢速路径。但是大部分时间我都没有,所以我可以使用缓存。