realpath -mオプションの使い方を解説!Linuxで存在しないファイルも正規化して絶対パスを取得する方法
生徒
「先生、Linuxでrealpathコマンドを使ってパスを確認してたら、存在しないファイルでも絶対パスが出てきたんですけど、それって大丈夫なんですか?」
先生
「はい、実はrealpathにはそういう動きをするオプションがあります。特に-mオプションを使うと、存在しないファイルでも“正規化”して絶対パスとして返してくれますよ。」
生徒
「“正規化”ってなんですか?難しそう…」
先生
「大丈夫!簡単な言葉で言うと“整理してきれいな形にする”ってことです。それでは、実際の使い方をわかりやすく見ていきましょう!」
1. realpathコマンドと正規化とは?
realpath(リアルパス)コマンドは、Linuxでファイルやディレクトリの絶対パス(すべての階層を含む完全なパス)を表示するためのコマンドです。
このとき、「正規化(せいきか)」とは、無駄な記号(例:..や.)を取り除いて、整理された形のパスに変換する処理のことを言います。
-mオプションは、存在していないファイルやディレクトリでもこの“整理された絶対パス”を返してくれるのが特徴です。
2. -mオプションの基本的な使い方
-mは--canonicalize-missingという長い名前の省略形です。どちらも同じ機能ですが、短い-mの方がよく使われます。
次のようなコマンドを実行してみましょう。
realpath -m ./docs/../notes/new.txt
/home/user/notes/new.txt
この例では、./docs/../notes/new.txtという「ややこしいパス」を、無駄な部分を取り除いてスッキリとした形に変換しています。
そして、このファイルnew.txtはまだ存在していなくても、realpath -mは絶対パスを返してくれます。
3. 存在しないファイルを指定した場合の動作
以下のように、実在しないファイルを指定してもエラーにはなりません。
realpath -m /home/user/missing/file.txt
/home/user/missing/file.txt
このとき、file.txtもmissingディレクトリも実在していなくても構いません。
ファイルが実際にあるかどうかに関係なく、正規化されたパスが返ってくるのが-mオプションの特徴です。
4. -eオプションとの違いを理解しよう
-e(もしくは--canonicalize-existing)は、存在するファイル・ディレクトリのみを対象にします。
一方、-mは存在しなくても構いません。
realpath -e /tmp/abc.txt
realpath: '/tmp/abc.txt' を解決できません: そのようなファイルやディレクトリはありません
realpath -m /tmp/abc.txt
/tmp/abc.txt
このように、柔軟にパスを扱いたいときは-m、安全第一でいきたいときは-eという使い分けができます。
5. スクリプトでの活用シーン
-mオプションは、以下のような場面でとても便利です。
- まだ作られていないファイルのパスを事前に確認したいとき
- ログファイルの出力先パスを整形しておきたいとき
- ユーザー入力の相対パスをきれいな絶対パスに変換したいとき
以下は、ファイル作成予定のパスを確認する例です。
newfile=$(realpath -m ./output/new_log.txt)
echo "ファイルを作成予定のパス:$newfile"
これで、new_log.txtがまだ無くても、安全にフルパスを準備できます。
6. 他のrealpathオプションとの併用は?
realpathには他にも便利なオプションがありますが、-mとは併用できないオプションもあります。
-eとの併用 → 不可(機能が真逆)-s(シンボリックリンクを解決しない)→ 使用可
たとえば、-mと-sを組み合わせて、シンボリックリンクを無視してパスだけを整える使い方もあります。
realpath -m -s ./some_symlink/file.txt
/home/user/some_symlink/file.txt
このように、-mは正規化処理が中心なので、他のオプションと組み合わせるときは目的を明確にすることが大切です。