シンボリックリンクのリンク先を取得する (readlink)

PHP

readlink関数がreadlinkコマンドとほとんど同じように動作する。

準備

$ 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 へのシンボリックリンク

実行例

echo readlink("AAA"); echo "\n";
// aaa

echo readlink("AAA/BBB"); echo "\n";
// bbb

echo readlink("aaa/bbb"); echo "\n";
// PHP Warning:  readlink(): Invalid argument
// bbbはシンボリックリンクではないので

echo readlink("AAA/bbb"); echo "\n";
// PHP Warning:  readlink(): Invalid argument
// AAAはシンボリックリンクだけどもbbbはシンボリックリンクではないので

echo readlink("AAA/DUMMY"); echo "\n";
// dummy
// リンク先が存在しなくてもOK

readlink 関数 | PHP Manual
http://php.net/manual/ja/function.readlink.php

Ruby

path がシンボリックリンクの場合に、path をリンク先に書き換える。

if File.exists?(path) && File.ftype(path) == 'link' then
  link = File.readlink(path)
  path = File.expand_path(link, File.dirname(path))
end

Perl

readlink は引数がシンボリックリンクの場合にリンク先のパスを返す。シンボリックリンクでない場合は undef を返す。 -l 演算子はシンボリックリンクかどうかを判定する。

if (-l path) {
    print readlink(path);
}

readlink | perldoc.jp
http://perldoc.jp/func/readlink

sh (シェルスクリプト)

readlinkコマンドを使える。

readlink -f シンボリックリンク

以下はlsコマンドを使って無理やりやる方法。 lsコマンドの出力フォーマットが違う環境だとうまくいかないかもしれない。

ls -l シンボリックリンク | perl -anle '$_ =~ /-> (.+)$/; print $1'
このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。