readlink コマンド

シンボリックリンクのリンク先を確認できるコマンド。

$ readlink -f シンボリックリンクのパス

-f を付けると階層の途中にあるすべてのシンボリックリンクを解決して、絶対パスにしてくれる。

-f を付けないと、階層の途中にあるシンボリックリンクはそのままで、また、指定したパスがシンボリックリンクでない場合は、なにも表示せずに、終了コード1を返す。

実行例

準備

$ mkdir -p aaa/bbb
$ ln -s aaa AAA
## aaa へのリンクを AAA という名前で作成
$ ln -s bbb aaa/BBB
## bbb へのリンクを aaa/BBB という名前で作成
## リンク先たる「bbb」は aaa/BBB からの相対パス

$ ln -s dummy aaa/DUMMY
## 存在しないリンク先

状況

$ find .
.
./AAA           # <- aaa へのシンボリックリンク
./aaa
./aaa/DUMMY     # <- リンク先が存在しないシンボリックリンク
./aaa/bbb
./aaa/BBB       # <- bbb へのシンボリックリンク

基本的な使い方の例

$ readlink AAA
aaa

$ readlink AAA/BBB
bbb

$ readlink aaa/bbb
## bbbはシンボリックリンクではないので、終了コード1で異常終了

$ readlink AAA/bbb
## AAAはシンボリックリンクだけどもbbbはシンボリックリンクではないので、終了コード1で異常終了

$ readlink aaa/DUMMY
dummy
## リンク先が存在しなくてもリンク先を表示

-f を使う例

$ readlink -f AAA
/home/foo/readlinktest/aaa
## 絶対パスで表示

$ readlink -f AAA/BBB
/home/foo/readlinktest/aaa/bbb
## AAAもBBBもリンク先に変換

$ readlink -f AAA/bbb
/home/foo/readlinktest/aaa/bbb
## 階層の途中であるAAAだけでもリンク先に変換

$ readlink -f aaa/bbb
/home/foo/readlinktest/aaa/bbb
## シンボリックリンクがなにもない場合はそのまま

$ readlink -f AAA/DUMMY
/home/foo/readlinktest/aaa/dummy

$ readlink -e aaa/DUMMY
## -f の代わりに -e を付けるとリンク先が存在しない場合に、終了コード1で異常終了
## 存在する場合は -f と同じ

シンボリックリンクへのシンボリックリンクがある場合

$ ln -s AAA AAB
## AAA へのリンクを AAB という名前で作成
## 以下のように連鎖的なリンクになる
## AAA -> aaa
## AAB -> AAA

$ readlink AAB
AAA
# -f がないと直接のリンク先を表示

$ readlink -f AAB
/home/foo/readlinktest/aaa
# -f を付けるとシンボリックリンクを2回たどって絶対パスで表示

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

オプション

-e
シンボリックリンクがパス階層の途中にあったり、連鎖している場合にもすべてのリンクを解決し、絶対パスに変換する。 指定したパスが存在しない場合、またはシンボリックリンクのリンク先が存在しない場合にエラーとする点
-f
シンボリックリンクがパス階層の途中にあったり、連鎖している場合にもすべてのリンクを解決し、絶対パスに変換する。 指定したパスが存在しない場合もエラーにはならないが、階層の途中からディレクトリごと存在しない場合はエラーになる
--help
ヘルプ表示
-f
シンボリックリンクがパス階層の途中にあったり、連鎖している場合にもすべてのリンクを解決し、絶対パスに変換する。 指定したパスが存在しない場合もエラーにはならない
-n
最後に改行を出力しない。echo-n と同じ
-v
エラーの場合にエラーメッセージを表示
--version
バージョン表示

-- というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、 - で始まるファイル名を扱いたい場合に使うとよい。

関連

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。