Entrer dans un répertoire lié par un lien

12

Quand je suis cdun lien, mon chemin actuel est préfixé avec le chemin du lien, plutôt que le chemin du répertoire vers lequel le lien est lié. Par exemple

~/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$

J'aimerais que mon chemin actuel soit changé pour le chemin du répertoire lié, afin de pouvoir également travailler avec les répertoires parents du répertoire lié. Outre lsle lien pour découvrir le répertoire lié, puis y cdaccéder, quelles sont les façons les plus simples d'accomplir cela? Par exemple, après cddans un lien, comment changez-vous votre chemin actuel en chemin du répertoire lié?

Tim
la source

Réponses:

22

Avec le shell POSIX, vous pouvez utiliser l' -Poption du cd intégré:

cd -P <link>

Avec bash, de man bash:

L'option -P dit d'utiliser la structure de répertoires physiques au lieu de suivre les liens symboliques (voir aussi l'option -P de la commande set set)

cuonglm
la source
7
Vous pouvez le faire cd -P .après l'original cd.
ctrl-alt-delor
5

Vous pouvez utiliser readlinkpour déterminer où votre lien pointe et fournir cette sortie comme cible de votre cd.

cd "$(readlink <link>)"

Dans le cas de liens symboliques supplémentaires pointant vers des liens symboliques, readlinkfournira simplement la cible, sauf si vous spécifiez l'une de ses options pour suivre les liens symboliques vers une cible de fichier canonique, par exemple readlink -f <link>.

readlink - valeur d'impression d'un lien symbolique ou d'un nom de fichier canonique

-f, --canonicalize
canonicalize en suivant chaque lien symbolique dans chaque composant du nom donné de manière récursive; tous sauf le dernier composant doivent exister

-e, --canonicalize-
canonicalize existant en suivant chaque lien symbolique dans chaque composant du nom donné récursivement, tous les composants doivent exister

-m, --canonicalize-manquant
canonicalize en suivant chaque lien symbolique dans chaque composant du nom donné de manière récursive, sans exigences sur l'existence des composants

Jon Surrell
la source
5

Les shells de type Korn gardent une trace des liens symboliques dans le chemin vers le répertoire courant (c'est ce qu'on appelle le suivi logique du répertoire courant). Si vous souhaitez développer tous les liens symboliques, passez l'option -Pau cdbuiltin (pour le suivi du répertoire physique actuel):

cd -P logic

Si vous vous trouvez dans un répertoire auquel vous avez accédé via un lien symbolique et que vous souhaitez basculer le répertoire courant suivi vers le chemin avec les liens symboliques développés, exécutez

cd -P .

Si vous souhaitez imprimer le chemin d'accès au répertoire actuel avec des liens symboliques développés, exécutez pwd -P. En bash, si vous souhaitez désactiver le suivi logique, exécutez set -P; en zsh, exécutez set -wou setopt chase_links.

Gilles 'SO- arrête d'être méchant'
la source