키워드를 기반으로 효율적으로 파일/디렉토리를 검색합니다.

키워드를 기반으로 효율적으로 파일/디렉토리를 검색합니다.

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

관련 정보