realpath --canonicalize-existingオプションの使い方を解説!Linuxで既存パスだけ絶対パス化する方法
生徒
「Linuxでrealpathコマンドを使って絶対パスを取得してるんですが、間違ったパスでも普通に表示されてしまって困っています…」
先生
「それはrealpathの仕様なんですが、実在するパスだけを対象にしたい場合には--canonicalize-existingというオプションを使うといいですよ。」
生徒
「あ、それって-eと同じでしたっけ?」
先生
「その通りです。実は--canonicalize-existingは-eの正式名称なんです。では、使い方を詳しく見てみましょう!」
1. realpathコマンドとは?
realpath(リアルパス)コマンドは、Linuxでファイルやディレクトリの絶対パスを表示するために使われるコマンドです。シンボリックリンク(ショートカットのようなもの)を解決して、本当に存在する場所(フルパス)を出力してくれます。
しかし、通常のrealpathでは、まだ存在しないファイルのパスでも絶対パスとして表示されてしまうため、間違ったパスでも結果が出てしまうという問題があります。
2. --canonicalize-existingオプションとは?
--canonicalize-existingオプションは、指定したファイルやディレクトリが本当に存在している場合にのみ、その絶対パスを表示するようにするためのものです。
このオプションを使うことで、タイプミスや削除されたパスなど、存在しないファイルを誤って処理してしまうリスクを減らすことができます。
実際には-eとまったく同じ動作をしますが、--canonicalize-existingの方が意味が明確で読みやすく、スクリプトや自動処理に向いていると言えます。
3. 基本的な使用例
それでは、まず存在しないファイルを指定してみましょう。
realpath --canonicalize-existing missing.txt
realpath: 'missing.txt' を解決できません: そのようなファイルやディレクトリはありません
このように、存在しないファイルを指定すると、エラーになります。
次に、存在するファイルを指定した場合を見てみましょう。
realpath --canonicalize-existing /etc/hosts
/etc/hosts
このように、実際にあるファイルであれば、正しい絶対パスが表示されます。
4. --canonicalize-existingと-eの違いは?
結論から言えば、--canonicalize-existingと-eは同じ機能です。
つまり、以下の2つのコマンドはまったく同じ動きをします:
realpath --canonicalize-existing /etc/hosts
realpath -e /etc/hosts
どちらを使うかは好みの問題ですが、可読性を重視したいときや、スクリプトで処理の意図を明確にしたいときには、長い名前の--canonicalize-existingを使うと良いでしょう。
5. 存在する親ディレクトリをたどって処理する例
--canonicalize-existingを使うと、指定したファイル自体だけでなくその親ディレクトリすべてが存在しているかもチェックされます。
たとえば、以下のように入力してみます。
realpath --canonicalize-existing ./non/exist/file.txt
realpath: './non/exist/file.txt' を解決できません: そのようなファイルやディレクトリはありません
このように、nonやexistという途中のディレクトリが存在しない場合も、エラーになります。
これは、安全にパスの検証をしたいときにとても役立ちます。
6. スクリプトでの活用例
以下のようにシェルスクリプト内で使うと、入力されたパスが実在するかどうかを確認してから処理できます。
path=$(realpath --canonicalize-existing "$1" 2>/dev/null)
if [ -z "$path" ]; then
echo "指定されたパスは存在しません"
exit 1
fi
echo "絶対パス:$path"
このように使えば、存在しないパスを誤って処理するのを防げるため、セキュリティや正確性が求められる場面でも安心して使えます。
7. 他のオプションとの比較
realpathには他にもさまざまなオプションがあります。以下はその一部です:
--canonicalize-missing(-m):存在しないファイルでも絶対パスを表示--no-symlinks:シンボリックリンクを解決せずに表示--logical:論理的なパスを表示(デフォルト)
今回の--canonicalize-existingは、安全性と確実性を重視する場面にぴったりのオプションです。