キーワードに基づいて効率的にファイル/ディレクトリを検索します。

キーワードに基づいて効率的にファイル/ディレクトリを検索します。

大きなビルドディレクトリツリーがあります。標準find検索は1〜2分後にファイルを探します。私はそれが数秒で完了したいと思います。

というファイルを探す必要がありますfoo.tar.gz。そのファイルは別のディレクトリーに存在できます。

/mnt/build/my_project/master/<BUILD_NAME>/foo.tar.gz
/mnt/build/my_project/master/<BUILD_NAME>/<PREFIX>/foo.tar.gz
/mnt/build/my_project/main/<BRANCH>/<BUILD_NAME>/foo.tar.gz
/mnt/build/my_project/main/<BRANCH>/<BUILD_NAME>/PREFIX>/foo.tar.gz
/mnt/build/my_project/side/<BUILD_NAME>/foo.tar.gz
/mnt/build/my_project/side/<BUILD_NAME>/<PREFIX>/foo.tar.gz

スクリプトの実行時間を短縮するために多くのif [[ -f .. ]]文を試しましたが、対処する必要がある場合が多すぎて、スクリプトを維持するのが面倒になりました。

私も次のfind文を試しました。

find /mnt/build/my_project/ -ipath "*${BUILD_NAME}*" -name foo.tar.gz -type f
find /mnt/build/my_project/ -wholename "*${BUILD_NAME}*/foo.tar.gz" -type f

ユーザーが提供した場合、すべてのディレクトリツリーを効率的に検索するにはどうすればよいですかBUILD_NAME

ありがとうございます!

答え1

を実行すると、findすべてのファイルを見つけるためにすべてのサブディレクトリを通過する必要があります。ファイルの深さをさらに下げたいと思うので、パラメータを渡して-maxdepth検索の深さを制限できます。

find /mnt/build/my_project/ -maxdepth 3 -wholename "*${BUILD_NAME}*/foo.tar.gz" -type f

あるいは、find完全にスキップしてシェルに検索させることもできます。シェルがbashであるとします(kshまたはzshに合わせて調整可能)。

shopt -s nullglob
candidates=(
  /mnt/build/my_project/*/"$BUILD_NAME"/*/foo.tar.gz
  /mnt/build/my_project/*/"$BUILD_NAME"/*/foo.tar.gz
  /mnt/build/my_project/*/*/"$BUILD_NAME"/*/foo.tar.gz
  /mnt/build/my_project/*/*/"$BUILD_NAME"/*/*/foo.tar.gz
)
case "${#candidates[@]}" in
  0) echo "No foo.tar.gz found";;
  1) echo "Got foo.tar.gz in ${candidates[0]}"
  *) echo "I don't know which foo.tar.gz to pick among" "${candidates[@]}";;
esac

検索の深さを制限する方法がない場合は、ツリーの一部を切り取るための確実な方法はありません。たぶん、すべてのディレクトリをスキップするのと同じくらい役に立たないいくつかのサブディレクトリをスキップすることができます.svn

find /mnt/build/my_project/ -name .svn -prune -o -wholename "*${BUILD_NAME}*/foo.tar.gz" -type f -print

関連情報