`cd dir / filename`을 dir /에 데려다주는 방법?


10

파일 인수 cd와 함께 사용할 수 있으면 매우 편리합니다 .

cd myDirectory/anyname.anyExtension 에 해당 cd myDirectory/

이 동작을 달성하기위한 가장 좋은 별칭 또는 기능은 무엇입니까?

편집 : 죄송합니다 .1 위를 언급하지 않았습니다 : 사용합니다zsh

답변:


5

에서 zsh자주하는 일 :

cd /path/to/somefile(:h)

(에 h대한 head).

경우 somefile심볼릭 링크는, 당신은 할 수 있습니다 :

cd somefile(:A:h)

심볼릭 링크의 대상이있는 디렉토리로 이동하십시오.


zsh크리스의 동등한은 '지금 bash- 단지 솔루션은 다음과 같습니다

cd() {
  [[ ! -e $argv[-1] ]] || [[ -d $argv[-1] ]] || argv[-1]=${argv[-1]%/*}
  builtin cd "$@"
}

에서 zsh"단어"가 무엇을 Ctrl-W제거 하는지 다시 정의 할 수도 있습니다 .

에서 zsh, 단어 기반 모션 / 조옮김 / 삭제 위젯의 문맥에서 "단어"는 일련의 숫자와 $WORDCHARS기본적으로 포함 하는 변수 의 문자를 더한 것 /입니다.

당신은 제거 할 수 /에서 $WORDCHARS그, 그래서 Ctrl-W하나 개의 경로 구성 요소를 삭제합니다 :

WORDCHARS=${WORDCHARS/\/}

또 다른 유용한 확장 기능은 select-word-style다른 단어 스타일 중에서 대화식으로 선택할 수 있는 위젯입니다.

autoload select-word-style
zle -N select-word-style
bindkey '\ew' select-word-style

그런 다음를 누르면 Alt-W다른 단어 스타일 중에서 선택할 수 있습니다.

$ cd /blah/blih<Alt-W>
Word styles (hit return for more detail):
(b)ash (n)ormal (s)hell (w)hitespace (d)efault (q)uit
(B), (N), (S), (W) as above with subword matching
?

흥미 롭군 (저도 zsh를 사용합니다).
Sébastien

파워 zsh스타일과 단어 스타일 에 대한 매우 흥미로운 편집 . zsh명령에 감사드립니다 . 완벽하게 작동합니다.
Sébastien

16

디렉토리를 입력하고을 사용하는 경우 여전히 원래 기능을 유지하려고한다고 가정합니다 bash.

cd() {
    local file="${!#}"

    if (( "$#" )) && ! [[ -d "$file" ]]; then
        builtin cd "${@:1:($#-1)}" "${file%/*}"
    else
        builtin cd "$@"
    fi
}

cd 옵션 ( -P, 등) 을 사용하지 않을 경우 에도 다음과 같이 충분합니다.

cd() { 
    if [ -d "$1" ] || [ -z "$1" ]; then
        builtin cd "$@"
    else
        builtin cd "${1%/*}"
    fi
}

4
함수 이름을 cd로 변경하면 호출 builtin앞에 추가해야 cd합니다
Ulrich Dangel

@Chris : 당신은 옳다고 생각했습니다.)이 기능을 사용할 수있게 해주셔서 감사합니다
Sébastien

cd옵션 을 유지하는 버전은 작동하지 않습니다 zsh. 더 간단한 것은 잘 작동 zsh하지만 BUT cd는 더 이상 다음과 동일하지 않습니다 cd ~: /
Sébastien

@Sebastien 지금 시도해 보시면 해결해야 할 것 같습니다.
Chris Down

@Chris, 실제로 확인을 추가하는 [ -z "$1" ]것으로 충분했습니다. 나는 Stephane의 답변을 받아 들여 더 가시성을 제공했습니다 zsh.
Sébastien

7

dirname경로에서 파일 이름을 제거하는 데 사용할 수 있습니다 ( 예 :

mycd() { cd "$(dirname "$1")"; }

참조하십시오 man dirname.


3
디렉토리를 입력하면 디렉토리 의 디렉토리로 변경되어 원치 않을 수도 있습니다 (원하는지 여부는 확실하지 않습니다).
Chris Down

1
@ChrisDown 사실이지만, 독자들에게 연습으로 남겨두고 당신의 대답은 그것을 다루는 방법을 보여줍니다.
Adrian Frühwirth

1
@ AdrianFrühwirth 운동! 하!

3

이것을에 추가 .profile한 다음로드하면 ( source ~/.profile또는 로그 아웃 한 후 다시 로그인 mycd [file or directory]하면) 올바른 디렉토리로 이동합니다.

mycd() { if [ -d "$1" ]; then cd "$1"; else cd "$( dirname "$1" )"; fi ; }

이름을 지정하면 cd이상한 일이 발생합니다.


1
디렉토리 이름에 공백이 있으면 명령 그룹을 종료하기 위해 세미콜론을 닫아야합니다. 당신을 위해 그것을 편집, 당신이 상관하지 않기를 바랍니다.
Chris Down

@ChrisDown은 다른 쉘에서도 마찬가지이지만에서 세미콜론을 닫을 필요는 없습니다 zsh.
Stéphane Chazelas

또한 다음 cd과 같이 args를 전달하면 중단됩니다 -P.
Chris Down

0
cd2() {
 arg=() dir= cmd= IFS=" " msg='[-L|[-P [-e]]|-h] [dir|file]'

 while [ "$#" -gt 1 ] ; do
  case "$1" in
   -h) printf "%s: cd2 %s\n" "$0" "$msg"
    return 1 ;;
   *) arg+=("$1") ;;
  esac
  shift
 done

 [ -f "${1:-}" ] && dir="$(dirname ${1:-})" || dir="${1:A}"
 [ ! -z "$arg" ] && cmd="cd ${arg[@]} $dir" || cmd="cd $dir"

 if ! $cmd 2>/dev/null; then
  printf "%s: cd2 %s\n" "$0" "$msg"
  return 1
 fi
}

라는 디렉토리가 주어지면 $(sudo reboot)이 함수는 시스템을 재부팅 할 수 있습니다. 또한 사용자가 아닌를 사용 zsh하고 bash있습니다.
Kusalananda

$ (sudo reboot) 명령을 지정하면이 기능이 시스템을 재부팅합니다. 또한 +1 처음에는 'zsh'를 알지 못했습니다.
ecwpz91

아니요, cd '$(sudo reboot)'디렉토리는 변경되지만 함수는 이름을 평가하려고 시도합니다.
Kusalananda

아,보고 변경했습니다. 작동하는지 알려주세요? 잘 잡았습니다.
ecwpz91
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.