realpathコマンドとは?Linuxで相対パスを絶対パスに変換する方法

Linux

Linuxで相対パスを絶対パスに変換したいときは、realpathコマンドを使用します。

たとえば、./logs/app.log../config/app.confのような相対パスを、/home/user/project/logs/app.logのような絶対パスに変換したい場面があります。

このようなときに便利なのがrealpathコマンドです。

realpathは、指定したパスを正規化し、絶対パスとして表示するLinuxコマンドです。シェルスクリプトで設定ファイルの場所を安定して取得したいときや、相対パスと絶対パスが混ざって分かりにくいときに役立ちます。

この記事では、Linux初心者でも理解できるように、realpathコマンドの基本構文、相対パスを絶対パスに変換する方法、シンボリックリンクの扱い、存在しないパスを扱う方法、basenamedirnameとの違い、シェルスクリプトでの実用例まで解説します。

  1. realpathコマンドとは
  2. realpathコマンドの基本構文
  3. 相対パスを絶対パスに変換する方法
  4. 親ディレクトリを含むパスを変換する方法
  5. ディレクトリの絶対パスを確認する方法
  6. ファイル名だけを指定した場合
  7. 複数のパスをまとめて変換する方法
  8. シンボリックリンクのリンク先を解決する方法
  9. シンボリックリンクを解決しない方法
  10. 存在しないパスを扱う方法
  11. 必ず存在するパスだけを扱う方法
  12. realpathコマンドの主なオプション
  13. 指定ディレクトリからの相対パスを表示する方法
  14. NUL文字区切りで出力する方法
  15. basename・dirname・realpathの違い
  16. readlink -fとの違い
  17. シェルスクリプトでrealpathを使う方法
  18. スクリプト自身の場所を取得する方法
  19. 設定ファイルをスクリプトと同じ場所から読み込む例
  20. findコマンドと組み合わせる方法
  21. realpathコマンドでよくある注意点
    1. 存在しないパスではエラーになる場合がある
    2. シンボリックリンクは通常リンク先へ解決される
    3. 変数は必ずクォートする
  22. realpathコマンドでよくあるエラー
    1. No such file or directory
    2. Permission denied
    3. 意図したパスと違う
  23. よくある質問
    1. realpathコマンドは何に使いますか?
    2. 相対パスを絶対パスに変換するには?
    3. 存在しないファイルでも絶対パスにできますか?
    4. シンボリックリンクのリンク先も解決されますか?
    5. basenameやdirnameとの違いは何ですか?
    6. readlink -fとrealpathはどちらを使えばよいですか?
    7. スペースを含むパスではどうすればよいですか?
    8. UbuntuやCentOS Streamでも使えますか?
  24. まとめ

realpathコマンドとは

realpathは、指定したパスを絶対パスに変換して表示するLinuxコマンドです。

たとえば、現在のディレクトリにsample.txtがある場合、次のように実行できます。

realpath sample.txt

実行結果の例です。

/home/user/sample.txt

ファイル名だけを指定しても、現在のディレクトリを基準にした絶対パスが表示されます。

realpathコマンドの基本構文

realpathコマンドの基本構文は次のとおりです。

realpath [オプション] パス

基本的には、絶対パスに変換したいファイルやディレクトリを指定します。

realpath ./sample.txt

複数のパスをまとめて指定することもできます。

realpath ./a.txt ../logs/app.log /tmp/test.txt

指定した各パスが、それぞれ絶対パスとして表示されます。

相対パスを絶対パスに変換する方法

最も基本的な使い方は、相対パスを絶対パスに変換する方法です。

まず、現在のディレクトリを確認します。

pwd

実行結果の例です。

/home/user/project

この状態で、次のように実行します。

realpath ./logs/app.log

実行結果の例です。

/home/user/project/logs/app.log

./logs/app.logという相対パスが、現在のディレクトリを基準にした絶対パスへ変換されました。

親ディレクトリを含むパスを変換する方法

..を含むパスも正規化できます。

realpath ../config/app.conf

現在のディレクトリが/home/user/projectの場合、実行結果は次のようになります。

/home/user/config/app.conf

..は1つ上のディレクトリを意味します。

realpathを使うと、...を含んだパスを整理して、分かりやすい絶対パスとして表示できます。

ディレクトリの絶対パスを確認する方法

ファイルだけでなく、ディレクトリにも使用できます。

realpath ./logs

実行結果の例です。

/home/user/project/logs

シェルスクリプトで作業ディレクトリを扱うときや、ログ保存先の絶対パスを確認したいときに便利です。

ファイル名だけを指定した場合

ファイル名だけを指定した場合、現在のディレクトリを基準に絶対パスが表示されます。

realpath sample.txt

実行結果の例です。

/home/user/project/sample.txt

このように、realpathは現在位置をもとにパスを補完してくれます。

複数のパスをまとめて変換する方法

realpathは複数のパスを一度に処理できます。

realpath sample.txt ./logs/app.log ../config/app.conf

実行結果の例です。

/home/user/project/sample.txt
/home/user/project/logs/app.log
/home/user/config/app.conf

複数のファイルやディレクトリをまとめて絶対パス化したいときに便利です。

シンボリックリンクのリンク先を解決する方法

realpathは、通常シンボリックリンクをたどって、リンク先の実体パスを表示します。

次のようにシンボリックリンクを作成します。

ln -s /var/log/app.log app-link.log

realpathで確認します。

realpath app-link.log

実行結果の例です。

/var/log/app.log

リンクそのものではなく、リンク先の実体パスが表示されます。

シンボリックリンクを含むパスを扱うとき、実際にどこを指しているのか確認したい場合に便利です。

シンボリックリンクを解決しない方法

シンボリックリンクを展開せず、パス文字列を正規化したい場合は、GNU版のrealpath-sオプションを使用できます。

realpath -s app-link.log

-sは、シンボリックリンクをたどらずにパスを表示します。

リンク先ではなく、指定したパスの見た目をなるべく残したい場合に利用します。

存在しないパスを扱う方法

通常のrealpathでは、存在しないパスを指定するとエラーになる場合があります。

realpath ./not_exists/sample.txt

実行結果の例です。

realpath: ./not_exists/sample.txt: No such file or directory

存在しないパスも絶対パスとして変換したい場合は、-mオプションを使います。

realpath -m ./not_exists/sample.txt

実行結果の例です。

/home/user/project/not_exists/sample.txt

-mは、存在しないパスを含んでいても可能な範囲で絶対パスとして表示するオプションです。

必ず存在するパスだけを扱う方法

パスのすべての要素が存在する場合だけ成功させたい場合は、-eオプションを使用します。

realpath -e sample.txt

存在するファイルなら絶対パスが表示されます。

存在しないパスを指定するとエラーになります。

realpath -e not_exists.txt

実行結果の例です。

realpath: not_exists.txt: No such file or directory

スクリプト内で「存在するファイルだけ処理したい」場合に使いやすいオプションです。

realpathコマンドの主なオプション

オプション 説明
-e すべてのパス要素が存在する場合だけ表示する
-m 存在しないパスも可能な範囲で絶対パス化する
-s シンボリックリンクを展開しない
-q 多くのエラーメッセージを表示しない
-z 出力の区切りを改行ではなくNUL文字にする
--relative-to=DIR 指定ディレクトリからの相対パスとして表示する
--relative-base=DIR 指定ディレクトリ配下なら相対パスで表示する
--help ヘルプを表示する
--version バージョン情報を表示する

指定ディレクトリからの相対パスを表示する方法

realpathは絶対パスを表示するだけでなく、--relative-toを使って指定ディレクトリからの相対パスを表示することもできます。

realpath --relative-to=/home/user /home/user/project/logs/app.log

実行結果です。

project/logs/app.log

指定したディレクトリを基準にした相対パスが表示されます。

絶対パスをそのまま扱うと長すぎる場合や、特定の作業ディレクトリを基準に表示したい場合に便利です。

NUL文字区切りで出力する方法

-zオプションを使用すると、出力の区切りが改行ではなくNUL文字になります。

realpath -z sample.txt ./logs/app.log

通常の画面表示では分かりにくいですが、ファイル名に改行などの特殊文字が含まれる可能性がある場合に役立ちます。

find -print0xargs -0と組み合わせる処理で利用されます。

basename・dirname・realpathの違い

パス操作でよく使うコマンドには、basenamedirnamerealpathがあります。

コマンド 役割
basename パス末尾のファイル名を取り出す report.txt
dirname ディレクトリ部分を取り出す /home/user/document
realpath 絶対パスに変換する /home/user/document/report.txt

次のパスを例にします。

./document/report.txt

basenameはファイル名を表示します。

basename ./document/report.txt
report.txt

dirnameはディレクトリ部分を表示します。

dirname ./document/report.txt
./document

realpathは絶対パスを表示します。

realpath ./document/report.txt
/home/user/project/document/report.txt

ファイル名を取り出したい場合はbasename、親ディレクトリを取り出したい場合はdirname、絶対パスに変換したい場合はrealpathを使用します。

readlink -fとの違い

Linuxでは、realpathと似た用途でreadlink -fが使われることがあります。

readlink -f ./sample.txt

どちらもシンボリックリンクを解決しながら絶対パスを表示する用途で使えます。

コマンド 主な用途
realpath パスを絶対パスへ変換する専用コマンド
readlink -f リンク先の解決を含めてパスを表示する

現在のLinux環境では、絶対パス化したい場合はrealpathを使うと意図が分かりやすいです。

シェルスクリプトでrealpathを使う方法

realpathはシェルスクリプトでよく使われます。

引数で受け取ったパスを絶対パスへ変換する例です。

#!/bin/bash

target="$1"
abs_path=$(realpath "$target")

echo "$abs_path"

実行例です。

./script.sh ./logs/app.log

実行結果の例です。

/home/user/project/logs/app.log

ユーザーが相対パスで指定しても、スクリプト内部では絶対パスとして扱えます。

スクリプト自身の場所を取得する方法

シェルスクリプト自身が置かれているディレクトリを取得したい場合、realpathdirnameを組み合わせます。

script_path=$(realpath "$0")
script_dir=$(dirname "$script_path")

echo "$script_dir"

$0には、実行されたスクリプトのパスが入ります。

realpath "$0"でスクリプト自身の絶対パスを取得し、dirnameでそのディレクトリ部分を取り出しています。

設定ファイルをスクリプトと同じ場所から読み込む例

スクリプトと同じディレクトリにある設定ファイルを読み込みたい場合、次のように書けます。

script_path=$(realpath "$0")
script_dir=$(dirname "$script_path")
config_file="$script_dir/config.conf"

echo "$config_file"

このようにすると、スクリプトをどのディレクトリから実行しても、スクリプトと同じ場所にあるconfig.confを参照しやすくなります。

findコマンドと組み合わせる方法

findで見つけたファイルを絶対パスに変換することもできます。

find . -name "*.log" -type f | while read path; do
  realpath "$path"
done

ファイル名にスペースや特殊文字が含まれる可能性がある場合は、-print0read -d ''を使う方法が安全です。

find . -name "*.log" -type f -print0 | while IFS= read -r -d '' path; do
  realpath "$path"
done

realpathコマンドでよくある注意点

存在しないパスではエラーになる場合がある

存在しないパスを通常指定すると、エラーになる場合があります。

存在しないパスも絶対パス化したい場合は、-mを使います。

realpath -m ./not_exists/file.txt

シンボリックリンクは通常リンク先へ解決される

realpathは通常、シンボリックリンクをたどって実体パスを表示します。

リンクを展開したくない場合は、-sを使います。

realpath -s link.txt

変数は必ずクォートする

シェルスクリプトで変数を使う場合は、次のようにダブルクォートで囲みます。

realpath "$path"

クォートしないと、スペースや記号を含むパスで問題が起きる可能性があります。

realpathコマンドでよくあるエラー

No such file or directory

realpath: sample.txt: No such file or directory

指定したファイルやディレクトリが存在しない場合に表示されます。

存在確認をする場合は、次のように確認します。

ls -l sample.txt

存在しないパスも絶対パスとして表示したい場合は、-mを使います。

realpath -m sample.txt

Permission denied

realpath: /root/test.txt: Permission denied

パスの途中にアクセス権限のないディレクトリが含まれている場合に表示されることがあります。

アクセス権限を確認します。

ls -ld /root

意図したパスと違う

シンボリックリンクを含むパスでは、リンク先の実体パスが表示されるため、見た目のパスと違って見えることがあります。

リンクをたどらずに確認したい場合は、-sを使います。

realpath -s link.txt

よくある質問

realpathコマンドは何に使いますか?

相対パスやシンボリックリンクを含むパスを、分かりやすい絶対パスへ変換するために使います。

相対パスを絶対パスに変換するには?

次のように実行します。

realpath ./sample.txt

存在しないファイルでも絶対パスにできますか?

-mオプションを使うと、存在しないパスも可能な範囲で絶対パスとして表示できます。

realpath -m ./not_exists/sample.txt

シンボリックリンクのリンク先も解決されますか?

通常はリンク先が解決され、実体のパスが表示されます。リンクを展開したくない場合は-sを使います。

basenameやdirnameとの違いは何ですか?

basenameはファイル名部分を取り出し、dirnameはディレクトリ部分を取り出します。realpathは指定したパスを絶対パスへ変換します。

readlink -fとrealpathはどちらを使えばよいですか?

絶対パス化したい目的ならrealpathの方が意図が分かりやすいです。シンボリックリンクのリンク先確認ではreadlink -fが使われることもあります。

スペースを含むパスではどうすればよいですか?

変数やパスをダブルクォートで囲みます。

realpath "$path"

UbuntuやCentOS Streamでも使えますか?

はい。Ubuntu、Debian、CentOS Stream、Rocky Linux、AlmaLinuxなど、一般的なLinuxディストリビューションで利用できます。

まとめ

realpathコマンドは、Linuxで相対パスを絶対パスに変換するためのコマンドです。

基本的な使い方は次のとおりです。

realpath ./sample.txt

実行結果の例です。

/home/user/project/sample.txt

存在しないパスも絶対パスとして表示したい場合は、-mを使用します。

realpath -m ./not_exists/sample.txt

シンボリックリンクを展開したくない場合は、-sを使用します。

realpath -s link.txt

シェルスクリプトでは、引数で受け取ったパスを絶対パスに変換したり、スクリプト自身の場所を取得したりする場面でよく使います。

script_path=$(realpath "$0")
script_dir=$(dirname "$script_path")

basenameはファイル名を取り出すコマンド、dirnameはディレクトリ部分を取り出すコマンド、realpathは絶対パスへ変換するコマンドです。

この3つをあわせて覚えておくと、Linuxのパス操作やシェルスクリプト作成がかなり扱いやすくなります。

コメント

タイトルとURLをコピーしました