Indo para um diretório ligado por um link

11

Quando eu cd a link, meu caminho atual é prefixado com o caminho do link, em vez do caminho do diretório para o qual o link é vinculado. Por exemplo,

~/dirlinks/maths$ ls -l logic
lrwxrwxrwx 1 tim tim 71 Jul 27 10:24 logic -> /windows-d/academic discipline/study objects/areas/formal systems/logic

~/dirlinks/maths$ cd logic
~/dirlinks/maths/logic$ pwd
/home/tim/dirlinks/maths/logic

~/dirlinks/maths/logic$ cd ..
~/dirlinks/maths$

Gostaria que meu caminho atual fosse alterado para o caminho do diretório vinculado, para que eu possa trabalhar com os diretórios pai do diretório vinculado também. Além de ls o link para descobrir o diretório vinculado e, em seguida, cd , quais são algumas maneiras mais simples de realizar isso? Por exemplo, depois de cd em um link, como você altera seu caminho atual para o caminho do diretório vinculado?

    
por Tim 27.07.2014 / 17:22

3 respostas

21

Com o shell POSIX, você pode usar a opção -P do cd incorporado:

cd -P <link>

Com bash , de man bash :

The -P option says to use the physical directory structure instead of following symbolic links (see also the -P option to the set builtin command)

    
por 27.07.2014 / 17:48
6

Shells semelhantes a Korn rastreiam links simbólicos no caminho para o diretório atual (isso é conhecido como rastreamento de diretório atual lógico). Se você deseja expandir todos os links simbólicos, passe a opção -P para o cd builtin (para rastreamento de diretório atual físico):

cd -P logic

Se você estiver em um diretório que acessou por meio de um link simbólico e quiser mudar o diretório atual rastreado para o caminho com os links simbólicos expandidos, execute

cd -P .

Se você quiser imprimir o caminho para o diretório atual com os links simbólicos expandidos, execute pwd -P . No bash, se você quiser desativar o rastreamento lógico, execute set -P ; em zsh, execute set -w ou setopt chase_links .

    
por 27.07.2014 / 23:20
5

Você pode usar readlink para determinar onde seu link aponta e fornecer essa saída como o destino de seu cd .

cd "$(readlink <link>)"

No caso de links simbólicos adicionais apontando para links simbólicos, readlink simplesmente fornecerá o destino, a menos que você especifique uma de suas opções para seguir links simbólicos para um destino de arquivo canônico, por exemplo readlink -f <link> .

readlink - print value of a symbolic link or canonical file name

-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist

-e, --canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist

-m, --canonicalize-missing
canonicalize by following every symlink in every component of the given name recursively, without requirements on components existence

    
por 27.07.2014 / 20:16