폴더까지 Bash CD

폴더까지 Bash CD

저는 함께 일하는 많은 사람들과 마찬가지로 Magento에서 많은 작업을 수행하고 있으며 다음과 같이 입력해야 한다는 것은 짜증나는 일입니다.

CD../../../../../../

루트 "httpdocs" 폴더에서 몇 개의 디렉터리만 검색하기 위해 다음 의사 코드를 따르는 스크립트를 만들어 보았습니다.

while lowest level directory != httpdocs
    cd ../
end while;

간단해 보입니다. 현재 작업 디렉토리의 마지막 부분이 httpdocs인지 확인하기 위해 grep을 수행해야 하고, 그렇지 않은 경우 true가 될 때까지 한 수준 위로 계속해야 한다고 가정합니다.

나는 이것을 위해 bash를 배우는 것에 대해 생각하고 있습니다. 이미 비슷한 것이 있는 것 같고 구문이 나를 끝없이 혼란스럽게 합니다.

답변1

upto.bashrc에서 이름을 기준으로 현재 경로의 모든 디렉터리로 이동할 수 있는 함수를 호출합니다 .

upto ()
{
    if [ -z "$1" ]; then
        return
    fi
    local upto=$1
    cd "${PWD/\/$upto\/*//$upto}"
}

또한 탭을 클릭하면 유효한 디렉터리 이름과 완성이 표시되도록 기능을 완료했습니다.

_upto()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    local d=${PWD//\//\ }
    COMPREPLY=( $( compgen -W "$d" -- "$cur" ) )
}
complete -F _upto upto

jd또한 현재 디렉터리 아래의 어떤 디렉터리로든 이동할 수 있는 또 다른 기능이 있습니다 .

jd(){
    if [ -z "$1" ]; then
        echo "Usage: jd [directory]";
        return 1
    else
        cd **"/$1"
    fi
}

예:

[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto h[TAB][TAB]
habitat       hippopotamus
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ upto hippopotamus
[/www/public_html/animals/hippopotamus] $ jd images
[/www/public_html/animals/hippopotamus/habitat/swamps/images] $ 

답변2

이건 틀림없어쉘 기능, 스크립트가 아닌 새 쉘에서 스크립트가 실행되기 때문입니다(따라서 원래 쉘의 디렉토리는 변경할 수 없습니다).

function cdroot()
{
  while [[ $PWD != '/' && ${PWD##*/} != 'httpdocs' ]]; do cd ..; done
}

물론 함수 이름은 원하는 대로 지정할 수 있습니다.

몇 가지 설명: 첫 번째 테스트( )는 httpdocs 폴더 내부가 아닐 때 테스트하는 $PWD != '/'경우 안전 장치입니다 . cdroot루트에 도달하면 중지됩니다.

두 번째 테스트( ${PWD##*/} != 'httpdocs')는 좀 더 복잡합니다. $PWD현재 디렉터리의 경로를 포함하는 변수입니다.${PWD##*/}마지막 슬래시까지 모든 것을 다듬습니다.

답변3

내가 생각할 수 있는 가장 간단한 bash 함수 .bashrc는 다음과 같습니다(루프나 외부 프로세스를 사용하지 않기 때문에 간단함).

cdup() {
    cd "${PWD/\/httpdocs\/*//httpdocs}"
}

이는 다음을 사용합니다.패턴 교체/httpdocs/매개변수 확장은 이후의 모든 내용을 $PWD"/httpdocs"로 대체합니다. bash 확장 구문의 슬래시와 구별하기 위해 경로에서 슬래시를 이스케이프해야 하기 때문에 매우 혼란스러워 보입니다. 또한 대체 문자열에서 슬래시를 이스케이프하지 마십시오. 그러면 일관성이 없어 보입니다.

현재 경로에 없으면 /httpdocs/교체가 수행되지 않고 현재 디렉터리만 변경됩니다.

예를 들어, 교체는 해당 디렉토리로 /a/b/c/httpdocs/e/f/g대체 /a/b/c/httpdocs됩니다 .cd

이 함수는 하위 프로세스가 상위 프로세스의 현재 디렉터리를 변경할 수 없기 때문에 현재 쉘 환경에(함수 또는 별칭으로) 있어야 합니다. 그렇기 때문에 .bashrc쉘 스크립트가 아닌 스크립트에 넣으라고 말한 것입니다 .

답변4

문제가 완전히 해결되지는 않지만 cd ../../../../../../시간이 절약될 것입니다. 나는 이것을 빌렸다알 수없는 사용자님의 게시물여기.


N 위로

디렉토리 트리에서 N 디렉토리 위로 이동

타이핑하는 대신

cd ../../../..

그냥 입력하시면 됩니다

up 4

그리고

cd -     

당신을 다시 데려올 것이다

함수를 .bashrc에 넣으면 사용할 준비가 됩니다.

# (c) 2007 stefan w. GPLv3            
function up {
ups=""
for i in $(seq 1 $1)
do
        ups=$ups"../"
done
cd $ups
}
        

관련 정보