readlink コマンド

シンボリックリンクの解決先やファイルの正規名を表示します。

概要

readlink コマンドは、シンボリックリンクの対象または、ファイルの正規パスを表示します。シンボリックリンクを解決し、実際の宛先パスを返します。これは、シンボリックリンクの指す先を判断したり、ファイルの絶対パスを取得したりする必要があるスクリプトに役立ちます。

オプション

-f, --canonicalize

与えられた名前の各コンポーネントのすべてのシンボリックリンクを再帰的に辿って正規化します。最後のコンポーネント以外は存在する必要があります

$ ln -s /etc/hosts mylink
$ readlink -f mylink
/etc/hosts

-e, --canonicalize-existing

与えられた名前の各コンポーネントのすべてのシンボリックリンクを再帰的に辿って正規化します。すべてのコンポーネントが存在する必要があります

$ readlink -e mylink
/etc/hosts

-m, --canonicalize-missing

与えられた名前の各コンポーネントのすべてのシンボリックリンクを再帰的に辿って正規化します。コンポーネントの存在に関する要件はありません

$ readlink -m /nonexistent/path
/nonexistent/path

-n, --no-newline

末尾の区切り文字(改行)を出力しません

$ readlink -n mylink && echo " (this is the target)"
/etc/hosts (this is the target)

-z, --zero

各出力行を改行ではなくNUL文字で終了します

$ readlink -z mylink | hexdump -C
00000000  2f 65 74 63 2f 68 6f 73  74 73 00                 |/etc/hosts.|
0000000b

-v, --verbose

エラーを報告します

$ readlink -v nonexistent
readlink: nonexistent: No such file or directory

使用例

シンボリックリンクを読み取る基本的な使用法

$ ln -s /usr/bin bin_link
$ readlink bin_link
/usr/bin

ファイルの絶対パスを取得する

$ readlink -f ../relative/path/to/file.txt
/absolute/path/to/file.txt

スクリプト内でreadlinkを使用する

$ SCRIPT_PATH=$(readlink -f "$0")
$ SCRIPT_DIR=$(dirname "$SCRIPT_PATH")
$ echo "This script is located in: $SCRIPT_DIR"
This script is located in: /home/user/scripts

ヒント:

-f、-e、-mの違い

シェルスクリプトでの使用

シェルスクリプトを書く際、readlink -f "$0"を使用して、呼び出し元に関係なくスクリプト自体の絶対パスを取得できます。

ファイル名のスペース処理

readlinkを使用する際は、スペースを含むファイル名を処理するために常に変数を引用符で囲みます:

$ readlink -f "$my_file"  # 正しい
$ readlink -f $my_file    # スペースがある場合は不正確

よくある質問

Q1. readlinkrealpathの違いは何ですか?

A. どちらのコマンドもシンボリックリンクを解決しますが、realpathは常に絶対パスを提供するのに対し、オプションなしのreadlinkは単にシンボリックリンクの対象を表示します。-fオプションを使用すると、readlinkrealpathと同様に動作します。

Q2. スクリプトを含むディレクトリを取得するにはどうすればよいですか?

A. dirname "$(readlink -f "$0")"を使用して、呼び出し元に関係なくスクリプトを含むディレクトリを取得できます。

Q3. オプションなしのreadlinkが通常のファイルで失敗するのはなぜですか?

A. オプションなしのreadlinkはシンボリックリンクでのみ機能します。通常のファイルでも機能させるには-fを使用してください。

Q4. ファイルがシンボリックリンクかどうかを確認するためにreadlinkを使用するにはどうすればよいですか?

A. オプションなしのreadlinkが出力を返す場合、そのファイルはシンボリックリンクです。エラーを返す場合、シンボリックリンクではありません。

参考文献

https://www.gnu.org/software/coreutils/manual/html_node/readlink-invocation.html

改訂履歴