역방향 재귀 검색을 통해 파일을 찾는 방법이 있습니까? [복사]

역방향 재귀 검색을 통해 파일을 찾는 방법이 있습니까? [복사]

다음과 같이 파일 구조의 깊은 디렉토리에 있다고 가정해 보겠습니다.

/home/cory/projects/foo/bar/bash/baz

현재 폴더 baz나 폴더 중 하나 에 있는 것으로 알고 있습니다.이상나(예: home, cory, projects, foo또는 ) bar에게 bash이라는 파일이 있습니다 happy. 추가 폴더를 검색하지 않고 어떻게 파일을 찾을 수 있나요?

답변1

#!/bin/bash

function upsearch () {
    test / == "$PWD" && return || test -e "$1" && echo "found: " "$PWD" && return || cd .. && upsearch "$1"
}

이 기능은 현재 디렉터리에서 시작됩니다. 이는 함수이며 탐색할 때 디렉토리를 변경한다는 점에 유의하세요. 파일이 있는 디렉터리에서 중지되며, 그렇지 않은 경우 루트 디렉터리 /로 이동합니다.

이를 함수가 아닌 스크립트로 변경하고 파일이 루트 디렉터리에 없으면 다시 이동할 수 있습니다.

해당 디렉토리로 CD를 이동하지 않으려면 다음을 수행하십시오.

upsearch () {
  local slashes=${PWD//[^\/]/}
  local directory="$PWD"
  for (( n=${#slashes}; n>0; --n ))
  do
    test -e "$directory/$1" && echo "$directory/$1" && return 
    directory="$directory/.."
  done
}

파일이 /home/cory/에 있는 경우 결과는 /home/cory/a/b/c/../../../happy와 같습니다. 깨끗한 도로가 필요하다면 할 수 있는 일이 있어요

cd "$directory"
echo "$PWD"
cd - 

성공에 대해.

검색을 일반 파일로 제한하고 디렉토리, 심볼릭 링크 등을 제외하려면 테스트를 -e 대신 -f로 변경할 수 있습니다.

답변2

-mindepth-maxdepth에 대한 옵션을 봅니다 find.

find디렉토리는 뒤로 탐색되지 않지만 일반 방향으로 접근하여 검색 깊이를 제한할 수 있습니다.

예를 들어:

find /home /home/cory /home/cory/projects /home/cory/projects/foo /home/cory/projects/foo/bar /home/cory/projects/foo/bar/bash -maxdepth 0 -name happy -print

답변3

현재 디렉터리를 저장하고 임의 테스트를 수행한 다음 응답을 반환하기 전에 원래 디렉터리를 복원하여 @user-unknown의 솔루션을 일부 개선했습니다. 무엇이든 테스트할 수 있기 때문에 더 유연합니다.

또한 얼마나 높아야 하는지 설명하는 선택적인 두 번째 매개변수도 제공합니다.

https://gist.github.com/1577473

#!/bin/bash

# Use this script instead of ~/.rvm/bin/rvm-prompt
# and the output of rvm-prompt will show up in your command prompt
# only if you are in a Ruby project directory.

# see http://stackoverflow.com/a/4264351/270511
# and http://unix.stackexchange.com/questions/13464/is-there-a-way-to-find-a-file-in-an-inverse-recursive-search

upsearch () {
  the_test=$1
  up_to=$2
  curdir=`pwd`
  result=1

  while [[ "`pwd`" != "$up_to" && "`pwd`" != '/' ]]; do
    if eval "[[ $the_test ]]"; then
      result=0
      break
    fi
    cd ..
  done
  cd $curdir
  return $result
}

if upsearch '-e Gemfile || ! -z "$(shopt -s nullglob; echo *.gemspec *.rb)"' ; then
  ~/.rvm/bin/rvm-prompt
fi

관련 정보