심볼릭 링크 파일의 디렉토리로 cd

심볼릭 링크 파일의 디렉토리로 cd

스크립트를 작성하기 전에 다음을 수행하는 쉬운 방법을 아는 사람이 있습니까?

$ pwd
/foo/bar
$ ls -l
lrwxr-xr-x  1 username  admin  48 Apr 17  2012 foo.sh -> /bar/foo.sh
$ cd /bar
$ ls
foo.sh

즉,디렉토리에서 (cd link) /foo/bar와 같은 작업을 수행 cdl하여 링크된 파일의 디렉토리(또는 링크 디렉토리(이런 경우에는 입력할 수 있음 cd -P /bar))로 이동하고 싶습니다.

답변1

zsh에는수정자이를 위해 또는 오히려 두 가지를 위해: A심볼릭 링크 해결(실제 경로) h"머리"(즉,dirname).

cd $file(:A:h)

이는 기호가 손상되지 않은 경우에만 작동합니다. 심볼릭 링크 체인이 존재하면 최종 목적지까지 이를 따른다. 심볼릭 링크를 통해 디렉토리에 도달하면 해당 대상에 있게 됩니다( 와 동일 cd -P).


zsh가 없고 해당 readlink유틸리티가 있고 심볼릭 링크 대상이 포함된 디렉터리로 변경하려는 경우:

cd -- "$(dirname -- "$(readlink -- "$file")")"

링크의 대상 자체가 기호 링크일 수 있습니다. 링크의 최종 대상이 포함된 디렉터리로 전환하려면 readlink루프에서 호출할 수 있습니다.

while [ -L "$file" ]; do
  target=$(readlink -- "$file")
  while case $target in */) target=${target%/};; *) false;; esac; done
  case $target in
    */*) cd -- "${target%/*}"; target=${target#**/};;
  esac
done

readlink -fLinux에서는 심볼릭 링크가 손상되지 않았다고 가정하고 정식 경로를 사용할 수 있습니다 .

t=$(readlink -f -- "$file")
cd "${t%/*}"

답변2

확인 심볼릭 링크를 사용한 readlink다음 dirname해당 디렉토리를 가져올 수 있습니다.

cdl () {
    cd "$(dirname "$(readlink "$1")")"; 
}
bash-3.2$ pwd
/foo/bar
bash-3.2$ ls -l
total 8
lrwxr-xr-x  1 root  wheel  11 Jun 15 19:10 foo.sh -> /bar/foo.sh
bash-3.2$ cdl foo.sh 
bash-3.2$ pwd 
/bar
bash-3.2$ 

답변3

한 줄:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))

관련 정보