Linuxで相対パスを絶対パスに変換したいときは、realpathコマンドを使用します。
たとえば、./logs/app.logや../config/app.confのような相対パスを、/home/user/project/logs/app.logのような絶対パスに変換したい場面があります。
このようなときに便利なのがrealpathコマンドです。
realpathは、指定したパスを正規化し、絶対パスとして表示するLinuxコマンドです。シェルスクリプトで設定ファイルの場所を安定して取得したいときや、相対パスと絶対パスが混ざって分かりにくいときに役立ちます。
この記事では、Linux初心者でも理解できるように、realpathコマンドの基本構文、相対パスを絶対パスに変換する方法、シンボリックリンクの扱い、存在しないパスを扱う方法、basename・dirnameとの違い、シェルスクリプトでの実用例まで解説します。
- realpathコマンドとは
- realpathコマンドの基本構文
- 相対パスを絶対パスに変換する方法
- 親ディレクトリを含むパスを変換する方法
- ディレクトリの絶対パスを確認する方法
- ファイル名だけを指定した場合
- 複数のパスをまとめて変換する方法
- シンボリックリンクのリンク先を解決する方法
- シンボリックリンクを解決しない方法
- 存在しないパスを扱う方法
- 必ず存在するパスだけを扱う方法
- realpathコマンドの主なオプション
- 指定ディレクトリからの相対パスを表示する方法
- NUL文字区切りで出力する方法
- basename・dirname・realpathの違い
- readlink -fとの違い
- シェルスクリプトでrealpathを使う方法
- スクリプト自身の場所を取得する方法
- 設定ファイルをスクリプトと同じ場所から読み込む例
- findコマンドと組み合わせる方法
- realpathコマンドでよくある注意点
- realpathコマンドでよくあるエラー
- よくある質問
- まとめ
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 -print0やxargs -0と組み合わせる処理で利用されます。
basename・dirname・realpathの違い
パス操作でよく使うコマンドには、basename、dirname、realpathがあります。
| コマンド | 役割 | 例 |
|---|---|---|
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
ユーザーが相対パスで指定しても、スクリプト内部では絶対パスとして扱えます。
スクリプト自身の場所を取得する方法
シェルスクリプト自身が置かれているディレクトリを取得したい場合、realpathとdirnameを組み合わせます。
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
ファイル名にスペースや特殊文字が含まれる可能性がある場合は、-print0とread -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のパス操作やシェルスクリプト作成がかなり扱いやすくなります。




コメント