경로 이름의 이전 단어를 변경하여 디렉토리를 변경합니다.

경로 이름의 이전 단어를 변경하여 디렉토리를 변경합니다.

다른 하위 수준 부모를 사용하여 거의 동일한 경로로 변경하는 방법은 무엇입니까? 예를 들어, 작업 중이고 동일한 경로로 이동해야 하는 경우 입력하지 않고 어떻게 거기에 갈 수 있습니까? 물론 우아하고 어색한 해결책도 있습니다.~/foobar/foo/data/images/2020/01/14/0001/barfoocd ~/foobar/bar/data/images/2020/01/14/0001/

답변1

ksh및 와 같은 일부 쉘에서는 zsh현재 디렉토리의 경로 이름에서 첫 번째 항목을 로 변경하여 cd word1 word2지정된 디렉토리를 변경합니다.word1word2

예를 들어, 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다음과 같이 두 인수를 합계로 처리하는 간단한 함수를 직접 만들 수도 있습니다.kshzsh

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으로 일치하지 않도록 해야 합니다 .foobarcd 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명령일 뿐이므로 파괴적인 일은 하지 않을 것입니다.

관련 정보