![심볼릭 링크 파일의 디렉토리로 cd](https://linux55.com/image/33004/%EC%8B%AC%EB%B3%BC%EB%A6%AD%20%EB%A7%81%ED%81%AC%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EB%A1%9C%20cd.png)
스크립트를 작성하기 전에 다음을 수행하는 쉬운 방법을 아는 사람이 있습니까?
$ 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 -f
Linux에서는 심볼릭 링크가 손상되지 않았다고 가정하고 정식 경로를 사용할 수 있습니다 .
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))