다른 하위 수준 부모를 사용하여 거의 동일한 경로로 변경하는 방법은 무엇입니까? 예를 들어, 작업 중이고 동일한 경로로 이동해야 하는 경우 입력하지 않고 어떻게 거기에 갈 수 있습니까? 물론 우아하고 어색한 해결책도 있습니다.~/foobar/foo/data/images/2020/01/14/0001/
bar
foo
cd ~/foobar/bar/data/images/2020/01/14/0001/
답변1
ksh
및 와 같은 일부 쉘에서는 zsh
현재 디렉토리의 경로 이름에서 첫 번째 항목을 로 변경하여 cd word1 word2
지정된 디렉토리를 변경합니다.word1
word2
예를 들어, zsh
셸에서 다음과 같습니다.
$ pwd
/usr/local/sbin
$ cd sbin bin
/usr/local/bin
$
${variable/pattern/replacement}
원래 에 있는 비표준 매개변수 대체를 지원하는 다른 쉘에서는 디렉토리를 생성하는 경로 이름을 ksh93
사용하여 다음으로 변경할 수 있습니다.${PWD/word1/word2}
$ pwd
/usr/local/sbin
$ cd "${PWD/sbin/bin}"
$ pwd
/usr/local/bin
이러한 셸( bash
예: ) 에서는 cd
다음과 같이 두 인수를 합계로 처리하는 간단한 함수를 직접 만들 수도 있습니다.ksh
zsh
cd () {
if [ "$#" -eq 2 ] && [[ $1 != -* ]]; then
command cd -- "${PWD/$1/$2}" &&
printf 'New wd: %s\n' "$PWD"
else
command cd "$@"
fi
}
[ "$#" -eq 2 ]
특수 동작이 트리거되어야 하는 시기를 감지합니다 cd
(명령줄 인수가 정확히 두 개 있는 경우). 그러나 우리가 테스트하는 [[ $1 != -* ]]
것은아니요와 함께 옵션을 사용하면 특별한 동작이 트리거됩니다 cd
. 함수 내에서 대체를 사용하면 command cd
함수가 재귀적으로 호출되는 것을 방지할 수 있습니다.cd
시험 bash
:
$ cd /usr/local/sbin
$ cd sbin bin
New wd: /usr/local/bin
$ cd local ''
New wd: /usr/bin
$ cd bin sbin
New wd: /usr/sbin
$ cd sbin local/sbin
New wd: /usr/local/sbin
$ cd '*/' /
New wd: /sbin
마지막 명령은 /
마지막 ;까지 일치하는 패턴으로 대체됩니다. 스키마를 참조해야 합니다. 패턴을 억제하고 항상 첫 번째 인수를 단어로 처리하려면 command cd "${PWD/"$1"/$2}"
함수에서 (인용부호 참고)를 사용하세요 $1
.
추가로 전체 디렉토리 이름에만 영향을 미치도록 대체하려면 를 사용하십시오 command cd "${PWD/"/$1/"/"/$2/"}"
. 두 인수 앞뒤에 인위적으로 삽입하면 /
디렉토리 이름의 하위 문자열 일치가 방지되지만 작동 방식과 호환되지 않게 되며 더 이상 허용되지 않습니다 zsh
. 끝에는 ksh
없기 때문에 디렉토리 경로의 마지막 부분에서 대체를 수행해야 합니다 (추가 "도움말"이 방해가 되기 전에만 도움을 줄 수 있습니다)./
이것회의그러나 cd foo bar
질문에 있는 예를 사용하시기 바랍니다. 그렇지 않으면 with 등 다른 방식 foo
으로 일치하지 않도록 해야 합니다 .foobar
cd foo/ bar/
답변2
그것은 간단합니다.
cd "$( echo "$PWD" | sed -e 's%/foo/%/bar/%' )"
sed
명령 뒤에 오는 문자를 s
구분 기호로 사용합니다.
답변3
CLI에서는 다음 예와 같이 수정자를 사용할 수 있습니다.
$ mkdir -p foobar/foo/data/images/2020/01/14/0001/
mkdir: created directory 'foobar'
mkdir: created directory 'foobar/foo'
mkdir: created directory 'foobar/foo/data'
mkdir: created directory 'foobar/foo/data/images'
mkdir: created directory 'foobar/foo/data/images/2020'
mkdir: created directory 'foobar/foo/data/images/2020/01'
mkdir: created directory 'foobar/foo/data/images/2020/01/14'
mkdir: created directory 'foobar/foo/data/images/2020/01/14/0001/'
$ ^bar/foo^bar/bar^
mkdir -p foobar/bar/data/images/2020/01/14/0001/
mkdir: created directory 'foobar/bar'
mkdir: created directory 'foobar/bar/data'
mkdir: created directory 'foobar/bar/data/images'
mkdir: created directory 'foobar/bar/data/images/2020'
mkdir: created directory 'foobar/bar/data/images/2020/01'
mkdir: created directory 'foobar/bar/data/images/2020/01/14'
mkdir: created directory 'foobar/bar/data/images/2020/01/14/0001/'
설명하다:
첫 번째 명령은 foobar로 시작하는 중첩 디렉터리를 만듭니다. 두 번째 명령은 ^ 수정자를 사용하여 이전 명령의 문자열을 새 문자열로 바꿉니다. 다음과 같이 입력하면 실수하기 쉽습니다.
^foo^bar^
그러나 이로 인해 명령이 다음으로 변경됩니다.
mkdir -p barbar/foo/data/images/2020/01/14/0001/
이는 선행 foo에도 영향을 미치기 때문에 이를 방지하려면 예상 문자열 앞이나 뒤에 일부 문자를 사용할 수 있습니다.
이 예에서는 mkdir을 사용했지만 cd도 비슷합니다. HTH.
답변4
때로는 마우스를 사용하는 것이 더 쉽습니다., 그래픽 데스크탑에서 좋은 터미널 에뮬레이터를 사용한다고 가정합니다. 또는 screen
최신 버전에서는 키보드 컨트롤을 사용하여 일부 텍스트를 복사/붙여넣을 수 있습니다.
$ pwd
/some/long/path
해당 경로를 명령에 복사하여 붙여넣습니다 cd
. 즉, 경로를 두 번 클릭하여 전체 경로를 선택하거나, 공백이 있는 경우 경로를 두 번 클릭하여 전체 줄을 가져옵니다. 그렇다면 붙여넣기 전에 작은따옴표를 입력하세요.
그런 다음 쉘의 줄 편집 키를 사용하여 Bash emacs
모드에서 이전 부분을 편집합니다.
- ctrl-a 커서를 줄의 시작 부분으로 이동합니다.
- 올바른 구성 요소를 찾을 때까지 ctrl-오른쪽 화살표(또는 alt-f)를 몇 번 눌러 단어 단위로 진행합니다.
- alt-d 또는 alt-backspace는 전체 단어를 앞뒤로 삭제합니다.
- 대체 항목(탭 완성 사용)을 입력하고 Enter 키를 누릅니다.
당신이 무언가를 더듬는다면 그것은 단지 cd
명령일 뿐이므로 파괴적인 일은 하지 않을 것입니다.