cd para o diretório de um arquivo simbolicamente vinculado

7

Antes de escrever um script, qualquer um sabe como fazer o seguinte:

$ 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

ie, no diretório /foo/bar , eu gostaria de fazer algo como cdl (cd link), o que me levaria ao diretório do arquivo vinculado (ou alternativamente a o diretório vinculado, se esse fosse o caso - se fosse eu poderia digitar cd -P /bar ).

    
por Chauncey Garrett 16.06.2013 / 00:52

3 respostas

7

No zsh, há um modificador para isso, ou melhor, dois: A para resolver links simbólicos (com realpath ) e h para extrair a “cabeça” (isto é, o dirname ).

cd $file(:A:h)

Isso só funciona se o simbólico não estiver quebrado. Se houver uma cadeia de links simbólicos, ela será seguida até o destino final. Se o diretório foi alcançado por meio de um link simbólico, você estará em seu destino (como em cd -P ).

Sem zsh, se você tiver o utilitário readlink e quiser mudar para o diretório que contém o destino do link simbólico:

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

O destino do link pode ser um link simbólico. Se você quiser mudar para o diretório que contém o destino final do link, você pode chamar readlink em um loop:

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

No Linux, supondo que o link simbólico não está quebrado, você pode usar readlink -f para canonicalizar o caminho:

t=$(readlink -f -- "$file")
cd "${t%/*}"
    
por 16.06.2013 / 02:33
7

Você pode usar readlink para resolver o link simbólico e, em seguida, dirname para obter seu diretório.

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$ 
    
por 16.06.2013 / 01:13
0

uma linha:

cd $(dirname $([ -L $0 ] && readlink -f $0 || echo $0))
    
por 29.08.2014 / 04:44