큰 빌드 디렉터리 트리가 있습니다. 표준 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