다음과 같이 파일 구조의 깊은 디렉토리에 있다고 가정해 보겠습니다.
/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