ターミナルでシンボリックリンクの完全に解決されたパスを取得する方法は?


47

私のラップトップにはpythonインストールの混乱があります。で実行可能ファイルを見ていましたが/usr/local/bin、それらはすべてへのシンボリックリンクです../../../Library......

これを取り巻く奇妙な動作がいくつかあります。私がしなければls -lhaG私が見る--->とシンボリックリンクの右への相対パス:

lrwxr-xr-x  1 root  wheel    69B Dec  7 22:29 python3 -> ../../../Library/Frameworks/Python.framework/Versions/3.1/bin/python3

ただし、そのパスを解決してpython3への実際のパスを表示するコマンドラインツールを入手できないようです。私はpwd -Pfindこれを行うためのユーティリティとユーティリティに関するいくつかのちらつきを見つけました。問題は、これらがOS Xでは動作せず、Linuxで動作する(つまり、シンボリックリンクへのフルパスを出力する)と人々が説明しているようには見えないことです。彼らは私のためにシンボリックリンクのパスを印刷するだけです:

FantasticMrFox:bin robert$ pwd -P python3
/usr/local/bin
FantasticMrFox:bin robert$ find `pwd -P` -name python3
/usr/local/bin/python3

ここで何が起こっているかについてのアイデアはありますか?

回答:


36

私はそう思うしpwd -Preadlinkこのタスクのためのあなたの友達になるだろう。

MacでGNUのreadlink -fの動作を取得するにはどうすればよいですか?」は便利なリソースです。

pwd -P symlinkディレクトリ内にいる場合にのみ機能します。

14:07:13 jason@mac ~ $ cd bin
14:08:08 jason@mac bin $ pwd -P
/Users/jason/Applications

readlink ターゲットを指定することで機能します(したがって、ファイルに対して使用できます)。

14:09:03 jason@mac ~ $ readlink bin
Applications

14:09:34 jason@mac ~ $ readlink /var
private/var

の出力は、指定されたターゲットのreadlink相対的であるように見えます。

例:の親/varであるが/、これprivate/varに関連し、正しいです/。上記のの例ではbin -> Applications、どちらもホームディレクトリにあり、どこで実行しても、出力は同じです。


3
readlinkは、シンボリックリンクが他のシンボリックリンクを指す場合には再帰しません。私は「完全に解決された」ことを呼び出すことはありません
ジェームズ・ロス

これは、のようなもので指定されたものへのシンボリックリンクに関するOPの質問では機能しないよう../..です。
user124384

18

これは再帰的に解決し、絶対パスを返します:

$ python
>>> import os
>>> os.path.realpath("/usr/local/bin/python3")

または、非インタラクティブバージョン:

python -c "import os; print(os.path.realpath('/usr/local/bin/python3'))"

1
ビルトインが失敗した場合は、スクリプトに頼ってください...いいですね。確かに動作します:> $ python -c "import os; print os.path.realpath('bin')"> /Users/jason/Applications。Macシステムと* nixシステムで統一された.bash_profile / $ PATHを使用するために、〜/ binを〜/ Applicationsにシンボリックリンクします。
ジェイソンサラズ

1
これは素晴らしく、うまく機能します!他の* nixシステムでできるように、シェルでこれを行う方法があるかどうかを知りたい場合を除いて、答えとしてマークします。
ロバートSチャシオ

1
他の* nixシステムでどのように実行しますか?また、現在、PythonはLinuxシステムにほぼ普遍的にインストールされています。
ジェイソンサラズ

@vxjasonxv私がこれをいじっていたときに見つけたものは、質問で私が話したコマンドpwdfindコマンドがOS X以外のシステム上のフルパスを解決することを示唆しました。しかし、私はそれらをテストしていません。
ロバートSチャシオ


1

GNUのcoreutilsの-8.15は、2012年に新しいコマンドラインツールを追加realpathあなたが欲しいものを行います。それは、シンボリックリンクのチェーンを解決し、絶対的な(デフォルト)または相対パスのどちらかとして結果を出力します。

AppleはまだrealpathmacOSに含まれていません(残念ながらすべてのGPLv3ツールを回避しているようです)が、Homebrew:などを使用して簡単にインストールできますbrew install coreutils


-2

を使用できますreadlink -f。すべてのリンクを再帰的に処理します。リンクがさらにリンクであるパスへのリンクであるとします。最終的な絶対パスが必要です。


え?あなたは正確に何を言っていますか?
ロブ14年

@DINESH SEHRAが言っていることの正しい構文はread link -f python3、たとえば、使用することであり、完全なシンボリックリンクをバッファリングします。
ダニエル・ジェームズW 14年

3
-fOS Xバージョンのreadlinkには存在しなかったので、OS Xユーザーによって明らかに投稿されていません。
ソリン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.