하위 디렉토리를 나열하지 않고 parent1/suba/sub에서 parent2/suba/sub로 CD를 이동하는 방법은 무엇입니까?

하위 디렉토리를 나열하지 않고 parent1/suba/sub에서 parent2/suba/sub로 CD를 이동하는 방법은 무엇입니까?

그 아래에 동일한 파일 구조를 가진 여러 개의 상위 디렉토리가 있습니다.

예:

parent1/suba/subb/
parent2/suba/subb/

나는 그곳에 있는 동안 그런 일을 하지 않는 parent1/suba/subb것으로 변화하고 싶었다 . 모든 하위 디렉터리와 목록을 나열하지 않고 어떻게 이 작업을 수행 할 수 있습니까?parent2/suba/subbcd ../../../parent2/suba/subb../

답변1

당신은 그것을 사용할 수 있습니다PWD바꾸다그리고매개변수 확장현재 디렉토리에 텍스트 변환을 빠르게 적용하도록 구성되었습니다.

cd ${PWD/parent1/parent2}

이는 경로 구성요소일 필요는 없으며 임의의 하위 문자열일 수 있습니다. 예를 들어, 경로가 실제로 parent1a이고 parent2경로 왼쪽에 더 이상 문자가 없는 경우 이 방법을 사용할 수 있습니다. 검색 문자열에는 여러 경로 구성 요소가 포함될 수 있지만 슬래시를 이스케이프 처리해야 합니다. 예를 들어 from에서 to로 이동하려면 를 사용합니다. 좀 더 정확하게 말하면 그 부분이 쉘 와일드카드 패턴이므로 .1cd ${PWD/1/2}~/checkout/trunk/doc/frobnicator/widget~/checkout/bugfix/src/frobnicator/widgetcd ${PWD/trunk\/doc/bugfix/src}parent1cd ${PWD/tr*c/bugfix/src}

존재하다다루기 힘든, 더 짧은 구문을 사용할 수 있습니다 cd parent1 parent2. 마찬가지로 경로의 모든 하위 문자열을 바꿀 수 있습니다(여기서는 와일드카드 패턴이 아니라 정확히 하위 문자열입니다).

Bash에서도 비슷한 기능을 구현할 수 있습니다.

cd () {
  local options
  options=()
  while [[ $1 = -[!-]* ]]; do options+=("$1"); shift; done
  if (($# == 2)); then
    builtin cd "${options[@]}" "${PWD/$1/$2}"
  else
    builtin cd "${options[@]}" "$@"
  fi
}

Zsh는 두 번째 매개변수에 대한 완성 기능을 제공합니다. 이것을 Bash에서 구현하는 것은 독자의 연습 과제로 남겨져 있습니다.

답변2

첫 번째

parent1 또는 parent2가 디렉토리 경로의 다른 위치에 있는 경우.

cd $(pwd | sed -e s:/parent1/:/parent2/: )

그래서 전환하면오직이 두 디렉토리에서

cd -
  • 그러면 점프한 디렉터리로 다시 이동합니다.

답변3

set위치 배열에 대상 디렉터리를 추가 할 수 있습니다 . 예를 들어:

cd ~
mkdir dirtest
cd dirtest
i=0
until [ "$((i=$i+1))" -gt 9 ] 
do mkdir -p parent"$i"/suba/subb
done

그러면 질문의 예를 모델로 한 부모 1-9를 포함하는 트리가 생성됩니다. 나는 지금 할 수있다:

set -- "$PWD/parent"[0-9]"/suba/subb"
cd "$1"; pwd

산출

/home/mikeserv/dirtest/parent1/suba/subb

... [0-9]글로벌 확장은 로케일에 따라 순서가 지정되기 때문에...

cd "$5"; pwd

/home/mikeserv/dirtest/parent5/suba/subb

cd "$9"; pwd

/home/mikeserv/dirtest/parent9/suba/subb

...0-9. 그러나 쉘은 정렬되지 않을 수 있습니다상위 10뒤쪽에아버지 9, 나중에 정렬하겠습니다.부모1. 그러나 정렬될 수 있습니다.상위 10뒤쪽에부모 09, 하지만. 두 자리 숫자에 도달하면 ${parameter expansion}숫자 주위에 중괄호를 사용하여 참조를 명시 "${10}""$1"으로 만들어야 합니다 0.

답변4

.bahsrc내 것에 는 (cd-edit)이라는 기능이 있습니다 .cd-e

cd-e (){  PWD=`echo "$PWD" | vipe +'normal $'`;  cd "$PWD"; }

vim커서가 끝에 있는 현재 디렉토리를 엽니다 (저는 끝 부분에서 편집하는 경향이 있기 때문에).

( Vipe는 의 일부 moreutils이거나 다음과 같습니다.

#!/bin/sh
set -e
trap 'rm -f "$tmp"' exit
tmp=`mktemp`
cat > "$tmp"
</dev/tty vi "$@" "$tmp" >/dev/tty
cat "$tmp"

)

관련 정보