디렉토리를 유사한 디렉토리 구조로 빠르게 변경하시겠습니까?

디렉토리를 유사한 디렉토리 구조로 빠르게 변경하시겠습니까?

테스트 환경에서 로그 파일 디렉터리 구조는 다음과 같습니다.

/var/Logs/int/app-id/region-code/log/file-name.log
/var/Logs/sat/app-id/region-code/log/file-name.log
/var/Logs/cat/app-id/region-code/log/file-name.log

환경당 많은 애플리케이션 ID가 있고 애플리케이션 ID당 여러 지역 코드가 있습니다(애플리케이션에 따라 다름).

디렉토리를 int에서 sat로 변경하고 경로의 나머지 부분은 모두 동일하게 유지할 수 있는 명령이 있습니까? 이와 같이:

$ pwd
/var/Logs/int/abc/01/log
$ cdswap int sat
$ pwd
/var/Logs/sat/abc/01/log
$ cdswap abc def
$ pwd
/var/Logs/sat/def/01/log

이것이 효과가 있다면 좋을 것입니다.

$ cdswap def/01 ghi/02
$ pwd
/var/Logs/sat/ghi/02/log

그러한 명령이 없는 경우 동일한 작업을 효과적으로 수행하도록 별칭을 설정할 수 있습니까? 어때요?

당신의 도움을 주셔서 감사합니다!

답변1

cdswapzsh 에서는 cd.... 두 개의 인수가 제공되면 cd현재 디렉터리의 첫 번째 인수를 두 번째 인수로 바꾸고 결과 디렉터리로 변경합니다.

cd함수를 생성하여 bash에서 이를 시뮬레이션 할 수 있습니다 .

cd () {
  local i=1
  while [[ "${!i}" = -* ]]; do ((++i)); done
  if ((i == $# - 1)); then
    local operands
    operands=("$@")
    operands[$i]=${PWD/${!i}/${!#}}
    if [[ "${operands[$i]}" == "$PWD" ]]; then
      echo >&2 "cd: string not in pwd: ${operands[$i]}"
      return 1
    fi
    set -- "${operands[@]:$(($#-1))}"
  fi
  builtin cd "$@"
}

답변2

이 쉘 기능을 사용하면 bash원하는 대로 작동할 것입니다. pwd;새 디렉터리 위치에 대한 업데이트가 눈에 띄지 않게 하려면 삭제하세요.

cdswap() { cd "${PWD/$1/$2}"; pwd; }

$ cd /usr/local/src
$ pwd
/usr/local/src
$ cdswap src bin
/usr/local/bin
$ pwd
/usr/local/bin
$ cdswap local/bin src
/usr/src

답변3

다음을 사용해 보세요:

cd $(echo $PWD | sed 's/abc/def/')

이러한 명령을 별칭으로 설정하면 경주가 시작됩니다.

교환하려는 파일을 교환할 수 있도록 기능으로 만들 수도 있습니다.

function cdswap() {
  cd $(echo $PWD | sed 's/$1/$2/')
}

그런 다음 해당 기능을 .bash_profile에 넣으십시오.

관련 정보