Linux / コマンド / readlink - シンボリックリンクの対象パスを確認

readlinkは、シンボリックリンクファイルに保存されている対象パスを出力するコマンドです。リンクが相対パスを含んでいるか、壊れたリンクがどの位置を指しているかを確認する際に便利です。

GNU readlinkは-f、-e、-mでパスの正規化もサポートしていますが、GNU Coreutilsは一般的なパス正規化には機能と名前がより明確なrealpathの使用を推奨しています。

readlinkコマンドとは?

シンボリックリンクを引数として指定すると、リンク内に保存されている対象文字列を出力します。

readlink current

currentリンクがreleases/2026-09を指している場合は、次のように出力されます。

releases/2026-09

この値は、リンクが存在する場所を基準として解釈される相対パスである場合があります。基本のreadlinkは、対象の文字列を絶対パスに変換せず、保存されている文字列をそのまま表示し、通常は末尾に改行を付けます。

基本的な文法と使い方

readlink [オプション] ファイル ...

以下はGNU Coreutils版を対象にした例です。空の練習用ディレクトリで実行し、同名のファイルやディレクトリがないことを先に確認してください。ln -s で例のリンクを作成してから確認できます。

ln -s releases/2026-09 current
readlink current

通常のファイルやディレクトリをオプションなしで指定すると、リンク先の値がないため出力されず、0以外の終了ステータスで失敗します。

readlink /etc/passwd
printf '%s\n' "$?"

相対リンクと絶対リンクの理解

相対パスを保存したリンク

/srv/app などは説明用のパスです。リンクの配置先となるディレクトリを用意し、自分が書き込める場所と未使用のリンク名に置き換えてください。リンク先そのものは存在しなくてもリンクを作れます。

相対リンクの対象は現在のターミナルの位置ではなく、リンクが置かれたディレクトリを基準に解釈されます。

ln -s ../shared/config.yml /srv/app/config.yml
readlink /srv/app/config.yml

出力は ../shared/config.yml です。このパスは /srv/app を基準に解釈され、/srv/shared/config.yml を指します。

絶対パスを保存したリンク

ln -s /srv/releases/2026-09 /srv/current
readlink /srv/current

絶対リンクはルートから始まる対象文字列を次のように出力します。

/srv/releases/2026-09

絶対リンクは位置が明確ですが、ファイルツリーを別の場所に移動すると壊れやすいです。配布構造と移動の可能性を考慮して、相対リンクと絶対リンクを選択してください。

壊れたシンボリックリンクを確認する

対象ファイルがなくてもシンボリックリンク自体が残っていれば、基本的にreadlinkは保存された対象文字列を読み取ることができます。

ln -s missing-target broken-link
readlink broken-link
missing-target

リンク先の存在有無は、次のように別途確認することができます。

if [ -L broken-link ] && [ ! -e broken-link ]; then
  printf '%s\n' '壊れたシンボリックリンクです.'
fi

-Lはリンク自体の存在を、-eはリンクをたどった先の存在を確認します。権限の問題やリンクの循環も結果に影響を与える可能性があります。

パス正規化オプション

GNU readlinkはリンク先文字列の出力のほか、パスを正規化するモードも提供します。

オプション 動作
-f, --canonicalize 最後の構成要素を除いたパスが存在している必要があり、シンボリックリンクとドット構成要素を解釈します。
-e, --canonicalize-existing 最後の項目を含むすべての構成要素が存在している必要があります。
-m, --canonicalize-missing 存在しない構成要素もディレクトリと仮定してパスを正規化します。

-fで正規化されたパスを出力する

readlink -f /srv/current/config.yml

シンボリックリンクと.、..を処理した絶対パスが出力されます。最後の項目はなくても許可される場合がありますが、その前の構成要素は存在する必要があります。

-eで全ての構成要素の存在を要求する

readlink -e /srv/current/config.yml

対象ファイルを含む全てのパスが存在する場合に結果が出力されます。存在確認後、実際に使用する前に対象が変わる競合状態までは防ぎません。

-mで存在しないパスも正規化する

readlink -m /srv/future/../uploads/new-file.txt

存在しない中間の構成要素も処理できるため、パス計画や文字列の整理に使用できます。出力された場所が実際に作成可能である保証はありません。

複数のリンクと出力区切りの処理

複数のシンボリックリンクを確認する

GNU readlinkは、複数のリンクを一度に取得できます。

readlink current previous config-link

各対象文字列は行単位で出力されます。入力と出力の対応関係が重要な場合は、ループ内でリンク名と結果を一緒に表示する方が明確です。

for link in current previous config-link; do
  target=$(readlink -- "$link") || continue
  printf '%s -> %s\n' "$link" "$target"
done

-nと-zの違い

-nまたは--no-newlineは、リンク1つを処理する時に出力の末尾の区切り文字を省略します。複数のファイルと一緒に使用すると警告が出る場合があります。

readlink -n current

-zまたは--zeroは、各結果の末尾に改行の代わりにNUL文字(値が0の区切り文字)を出力します。ファイル名やリンク先に改行が含まれる可能性がある自動化では、-zの方が明確です。

readlink -z current previous

readlink、realpath、lsとstatの比較

コマンド 主な目的 特徴
readlink リンクに保存された対象文字列を確認 壊れたリンクでもリンク自体を読み取ることが可能
realpath ファイル名の正規化と相対パス計算 GNUの文書が一般的なパス正規化に推奨するコマンド
ls -l リスト内でリンクと対象を人間が読みやすく確認 他のリスト情報と一緒に表示され、パースには不向き
stat リンクまたは対象の詳細メタデータを確認 inode、権限、時間、ファイル種類の確認が可能

自動化でリンクの対象文字列のみが必要な場合はreadlinkが適しています。一般的なパスの正規化と相対パス変換が目的であればrealpathコマンドの方が明確です。

シェルスクリプトでの活用方法

リンク対象が相対パスかどうか確認する

以下の例では、先に link=current のように調べたいリンクのパスを変数に設定します。通常のLinuxシンボリックリンクが対象です。コマンド置換は末尾の改行を除去するため、リンク先の文字列が改行で終わる場合には、この代入方法で完全には保持できません。

target=$(readlink -- "$link") || {
  printf '%s\n' 'シンボリックリンクを読むことができません.' >&2
  exit 1
}

case "$target" in
  /*) printf '%s\n' '絶対パスリンクです.' ;;
  *)  printf '%s\n' '相対パスリンクです.' ;;
esac

相対パスを実際の位置に計算するには、リンクがあるディレクトリを基準にする必要があります。現在の作業ディレクトリに単純に追加すると、誤ったパスになる可能性があります。

終了状態を確認する

出力が空かどうかだけを確認するのではなく、コマンドの成功を確認してください。リンク先が空文字列になることはありませんが、エラー処理の意図をより明確に表現できます。

if target=$(readlink -- "$link"); then
  printf '%s\n' "$target"
else
  printf 'リンクを読むことができませんでした: %s\n' "$link" >&2
fi

主なオプションまとめ

オプション 説明
-f, --canonicalize 最後の項目を除いた構成要素が存在するパスを正規化します。
-e, --canonicalize-existing すべてのパス構成要素が存在する必要があります。
-m, --canonicalize-missing 存在しない構成要素もディレクトリのように扱います。
-n, --no-newline 単一の結果の後の出力区切り文字を省略します。
-z, --zero 各結果をNUL文字で終えます。
-q, -s, --quiet ほとんどのエラーメッセージを抑制します。
-v, --verbose エラーメッセージを表示します。

よく発生する問題

何も出力せずに失敗します。

デフォルトモードで指定したパスがシンボリックリンクではないか、リンク自体にアクセスできない場合があります。終了ステータスを確認し、必要に応じて-vでエラーメッセージを表示してください。

相対リンクの対象が別の場所に見えます。

出力された相対パスはリンクが置かれているディレクトリを基準に解釈する必要があります。コマンドを実行した現在のディレクトリが基準ではありません。

readlink -fは他のシステムでは動作しません。

-fをはじめとする正規化オプションには実装の違いがあります。移植性が必要なスクリプトでは対象OSのサポート有無を確認し、パスの正規化が目的であれば利用可能なrealpathの実装とオプションも比較してください。

FAQ

readlinkはシンボリックリンクが指すファイルの内容を読みますか?

いいえ。基本モードでは、リンクファイルに保存されている対象パス文字列を出力します。対象ファイルの内容は読みません。

壊れたシンボリックリンクもreadlinkで確認できますか?

リンク自体が存在し読み取れる場合、通常の readlink で保存されたリンク先の文字列を確認できます。-e による正規化が成功するには、実際のリンク先も存在する必要があります。

相対パスが出力されますが、絶対パスを確認するにはどうすればよいですか?

GNU環境では readlink -f リンク を使えますが、一般的なパスの正規化には realpath を使う方が機能と意図が明確です。

ls -lの代わりにreadlinkを使用する理由は何ですか?

ls -l は人が読む一覧に適し、readlink はリンク先の文字列だけを出力するためスクリプトで利用しやすくなります。自動化では終了状態とファイル名の区切り方も併せて処理してください。

参考資料