현재 트리의 특정 깊이에 있는 디렉토리로 이동하는 방법은 무엇입니까?

현재 트리의 특정 깊이에 있는 디렉토리로 이동하는 방법은 무엇입니까?

저는 보통 같은 서버에 있는 여러 폴더( dev1, , 및 )에서 dev2작업합니다 . dev3폴더 구조는 다음과 같습니다.

  • /var/www/html/dev1/a/b/c/d/e/f
  • /var/www/html/dev2/a/b/c/d/e/f
  • /var/www/html/dev3/a/b/c/d/e/f

c특정 폴더(예: 또는 d또는 eof) 에 있을 때 /var/www/html/dev3/나를 데려가는 명령이 있습니까 /var/www/html/dev3/a?

폴더 또는 /var/www/html/dev1/a.cde/var/www/html/dev1/

답변1

방법 #1 - 상대 CD

현재 위치에서 특정 깊이 위로 이동하는 가장 쉬운 방법은 다음 명령을 실행하는 것입니다.

$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ cd ../../../../..

$ pwd
/Users/sammingolelli/adir/dev3/a

방법 #2 - pushd/popd

이 외에도 pushd및 를 popd스택으로 사용하여 FIFO 또는 디렉터리로 이동한 후 스택에서 이전에 푸시된 디렉터리로 돌아갈 pushd때 알려주는 FIFO 또는 디렉터리를 유지 관리할 수 있습니다.popd

$ pwd
/Users/sammingolelli/adir/dev3/a
$ dirs
~/adir/dev3/a

$ pushd b/c/d/e/f/
~/adir/dev3/a/b/c/d/e/f ~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a/b/c/d/e/f

$ popd
~/adir/dev3/a
$ pwd
/Users/sammingolelli/adir/dev3/a

방법 #3 - 별칭

원하는 작업을 수행하기 위해 별칭을 만들 수도 있습니다. 이 문제를 다루는 여러 Q&A가 이미 사이트에 있거나 @fastrizwaan의 답변을 참조하세요.

방법 #4 - CDPATH

이 대답을 봐@직원, 이 Q&A에 관해: 터미널에서 빠른 디렉토리 탐색.

더 나아가 도구를 사용하시나요?

위의 두 가지 방법은 가장 일반적으로 사용되는 이동 방법입니다. 물론 다른 도구를 탐색 도구로 설치할 수도 있습니다. 이러한 도구는 이 사이트에서 많이 논의되었습니다. 마음에 떠오르는 것 중 하나는 특정 디렉토리를 "북마크"하고 짧은 이름으로 매핑하여 어디에서나 쉽게 변경할 수 있게 해주는 북마크 도구입니다.

자동 점프

나는 이 Q&A에서 그러한 도구 중 하나에 대해 논의합니다.짧은 경로를 만드는 방법은 무엇입니까?. 도구가 호출됩니다.자동 점프.

다른 사람

다음과 같은 제목의 Q&A에 제안된 몇 가지 다른 사항이 있습니다.터미널에서 빠른 디렉토리 탐색.

답변2

이것은 기능적인 작업입니다. 쉘이 bash라고 가정하면 .bashrc이 기능은 다음에 bash를 시작할 때 사용할 수 있습니다.

cdwww () {
}

무엇을 해야 합니까 ? 주문이어야 합니다 cd. 현재 디렉토리의 경로는 변수에 있습니다 PWD.문자열 처리그리고 다른 구조물.

/var/www/html예를 들어 현재 디렉터리가 아래에 있는 경우 다음 함수는 현재 디렉터리보다 한 수준 위의 디렉터리로 이동합니다 /var/www/html.

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

이 함수가 다른 하위 디렉터리에 대한 경로를 허용하도록 만들 수 있습니다 /var/www/html/dev*/a.

cdwww () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    cd "${PWD%"$d"}/$1"
  else
    echo 1>&2 "$0: not under a web root"
    return 3
  fi
}

또 다른 방법은 디렉터리를 변경할 때마다 대상 디렉터리에 변수를 설정하는 것입니다. 다음 코드는 chpwd현재 디렉터리가 변경될 때마다 이 함수가 실행되도록 예약합니다.

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  if [[ $PWD = /var/www/html/*/* ]]; then
    local d="${PWD#/var/www/html/*/*/}"
    html_root="${PWD%"$d"}"
  else
    unset html_root
  fi
}

그런 다음 다음을 사용할 수 있습니다 cd $html_root(또는 $html_root켠 경우shopt -s autocd).

답변3

이제 귀하의 질문을 이해합니다.

cd $(pwd|cut -c 1-18)/a

/var/www/html/dev1/a당신이 아래나 안에 있을 때, dev1아래 /var/www/html/dev2/a나 안에 있을 때 dev2등 으로 당신을 데려갈 것입니다 .

cut여기에 해킹이 있는 것 같습니다. 18경로가 변경되면 변경해야 하지만 정규식을 사용하는 더 우아한 솔루션을 찾지 못했습니다.

답변4

존재하다 zsh:

cd $PWD[1,(rn[5])/]

첫 번째 문자 에서cd 하위 문자열을 시작 하고 $PWD첫 번째 문자 발생 에서 끝납니다 . 따라서 다음과 같습니다.15/

1 2 3 4 5
/var/www/html/dev1/a/b/c/d/e/f

그러면 하나가 될 것입니다 cd /var/www/html/dev1/.

도우미 함수를 만들 수 있습니다.

cdd() cd $PWD[1,(rn:argv[1]:)/]

예를 들어, 인수로 주어진 epth 내에서 cd.$PWDdcdd 5

관련 정보