リンクでリンクされたディレクトリに移動する


12

Iときcdリンクは、私の現在のパスではなく、へのリンクリンクディレクトリのパスよりも、リンクのパスが付いています。例えば

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

現在のパスをリンクされたディレクトリのパスに変更して、リンクされたディレクトリの親ディレクトリも操作できるようにしたいと考えています。lsリンクされたディレクトリを見つけてそこcdに移動するリンクのほかに、それを達成するためのいくつかの簡単な方法は何ですか?たとえばcd、リンクに入った後、現在のパスをリンクされたディレクトリのパスにどのように変更しますか?

回答:


22

POSIXシェルで-Pは、cdビルトインのオプションを使用できます。

cd -P <link>

bash、からman bash

-Pオプションは、シンボリックリンクをたどるのではなく、物理ディレクトリ構造を使用するように指示します(set組み込みコマンドの-Pオプションも参照してください)。


7
cd -P .元の後にこれを行うことができますcd
ctrl-alt-delor 2014

5

を使用readlinkして、リンクが指す場所を判別し、この出力をのターゲットとして提供できますcd

cd "$(readlink <link>)"

シンボリックリンクを指す追加のシンボリックリンクの場合は、シンボリックリンクreadlinkをたどるオプションのいずれかを指定しない限り、はターゲットを提供しますreadlink -f <link>

readlink-シンボリックリンクまたは正規のファイル名の値を出力する

-f、--
canonicalize canonicalize指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどります。最後のコンポーネントを除くすべてが存在する必要があります

-e、--
canonicalize -existing canonicalize指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、すべてのコンポーネントが存在する必要があります

-m、--
canonicalize -missing canonicalize指定された名前のすべてのコンポーネントのすべてのシンボリックリンクを再帰的にたどることにより、コンポーネントの存在を必要としない


5

Kornのようなシェルは、現在のディレクトリへのパスにあるシンボリックリンクを追跡します(これは、論理的な現在のディレクトリの追跡と呼ばれます)。すべてのシンボリックリンクを展開する場合は、オプション-Pcd組み込み(物理的な現在のディレクトリの追跡用)に渡します。

cd -P logic

シンボリックリンクを介してアクセスしたディレクトリにいて、追跡されている現在のディレクトリを、シンボリックリンクが展開されたパスに切り替えたい場合は、次のコマンドを実行します。

cd -P .

シンボリックリンクを展開して現在のディレクトリへのパスを出力する場合は、を実行しpwd -Pます。bashで論理追跡をオフにする場合は、を実行しset -Pます。zshでは、set -wまたはを実行しsetopt chase_linksます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.