그 아래에 동일한 파일 구조를 가진 여러 개의 상위 디렉토리가 있습니다.
예:
parent1/suba/subb/
parent2/suba/subb/
나는 그곳에 있는 동안 그런 일을 하지 않는 parent1/suba/subb
것으로 변화하고 싶었다 . 모든 하위 디렉터리와 목록을 나열하지 않고 어떻게 이 작업을 수행 할 수 있습니까?parent2/suba/subb
cd ../../../parent2/suba/subb
../
답변1
당신은 그것을 사용할 수 있습니다PWD
바꾸다그리고매개변수 확장현재 디렉토리에 텍스트 변환을 빠르게 적용하도록 구성되었습니다.
cd ${PWD/parent1/parent2}
이는 경로 구성요소일 필요는 없으며 임의의 하위 문자열일 수 있습니다. 예를 들어, 경로가 실제로 parent1
a이고 parent2
경로 왼쪽에 더 이상 문자가 없는 경우 이 방법을 사용할 수 있습니다. 검색 문자열에는 여러 경로 구성 요소가 포함될 수 있지만 슬래시를 이스케이프 처리해야 합니다. 예를 들어 from에서 to로 이동하려면 를 사용합니다. 좀 더 정확하게 말하면 그 부분이 쉘 와일드카드 패턴이므로 .1
cd ${PWD/1/2}
~/checkout/trunk/doc/frobnicator/widget
~/checkout/bugfix/src/frobnicator/widget
cd ${PWD/trunk\/doc/bugfix/src}
parent1
cd ${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"
)