web-dev-qa-db-ja.com

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

リンクを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をリンクに挿入した後、現在のパスをリンクされたディレクトリのパスにどのように変更しますか?

12
Tim

POSIXシェルでは、組み込みの cd-Pオプションを使用できます。

cd -P <link>

bashの場合、man bashから:

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

22
cuonglm

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

cd "$(readlink <link>)"

シンボリックリンクを指す追加のシンボリックリンクの場合、readlinkは単純なターゲットを提供します。ただし、readlink -f <link>などの標準ファイルターゲットへのシンボリックリンクをたどるオプションを1つ指定しない限り、.

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

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

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

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

5
Jon Surrell

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

cd -P logic

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

cd -P .

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