大きなビルドディレクトリツリーがあります。標準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