リンクでリンクされたディレクトリを入力してください。

リンクでリンクされたディレクトリを入力してください。

リンク時に、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リンクを入力したら、現在のパスをリンク先ディレクトリのパスに変更できますか?

答え1

POSIX シェルでは、-P次のオプションを使用できます。CD内蔵:

cd -P <link>

bash、次からman bash

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

答え2

Kornなどのシェルは、現在のディレクトリパスのシンボリックリンクを追跡します(これを論理現在のディレクトリトレースと呼びます)。すべてのシンボリックリンクを拡張するには、組み込み関数-Pにオプションを渡します(物理的な現在のディレクトリ追跡用)。cd

cd -P logic

シンボリックリンクを介してアクセスされているディレクトリにあり、追跡している現在のディレクトリをシンボリックリンクに拡張されたパスに切り替えるには、次の手順を実行します。

cd -P .

現在のディレクトリへのパスを印刷してシンボリックリンクを展開するには、を実行します。 bashpwd -Pで論理トレースをオフにするにはset -Pzshから。set -wsetopt chase_links

答え3

これを使用してreadlinkリンクが指す位置を決定し、この出力をcd

cd "$(readlink <link>)"

追加のシンボリックリンクがシンボリックリンクを指している場合は、readlinkファイルの保存先へのシンボリックリンクに従うオプションの1つを指定しない限り、ターゲットのみが提供されますreadlink -f <link>

リンクを読む- シンボリックリンクまたは標準ファイル名の値を印刷します。

-f, --canonicalize
指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡して正規化します。最後のコンポーネントを除くすべてのコンポーネントが存在する必要があります。

-e, --canonicalize-existing
指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを再帰的に追跡して正規化します。すべてのコンポーネントが存在する必要があります。

-m, --canonicalize-missing は、
コンポーネントが存在しなくても、指定された名前を持つすべてのコンポーネントのすべてのシンボリックリンクを繰り返し追跡して正規化します。

関連情報