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は正規化処理が中心なので、他のオプションと組み合わせるときは目的を明確にすることが大切です。
まとめ
realpath -mの基本と重要なポイント
realpathコマンドの中でも特に-mオプションは、Linuxにおけるパス操作の柔軟性を大きく高めてくれる重要な機能です。通常のrealpathは、実在するファイルやディレクトリを前提として絶対パスを取得しますが、-mオプションを使用することで、存在しないファイルであっても正規化された絶対パスを取得することが可能になります。
これはシェルスクリプトや自動化処理において非常に有効であり、特にログファイルの出力先や、これから生成するファイルの保存先を事前に整理しておきたい場面で大きな効果を発揮します。パスの正規化とは、ドットやドットドットなどの冗長な記述を取り除き、シンプルで一意に解釈できるパスへと変換する処理を指します。
実務で役立つ使いどころ
実際の開発現場では、ユーザー入力による相対パスの処理や、複雑に組み合わされたディレクトリ構造の整理が頻繁に発生します。そのようなときにrealpath -mを活用することで、想定外のパス解釈ミスを防ぎ、安定した動作を実現することができます。
また、存在チェックを行わずにパスを整形できるため、事前準備の段階でも安心して利用できる点が大きなメリットです。これは特にバッチ処理やバックアップ処理、ログ管理スクリプトなどで重宝されます。
サンプルコードで理解を深める
以下は、存在しないディレクトリを含むパスを正規化し、変数に格納するシンプルな例です。Linuxコマンドの基本としても覚えておくと便利です。
path=$(realpath -m ./data/../logs/app.log)
echo $path
/home/user/logs/app.log
このように、存在していないlogsディレクトリやapp.logファイルであっても、問題なく整理された絶対パスを取得できます。スクリプト内でパスを統一的に扱うための基本テクニックとして覚えておきましょう。
-eオプションとの使い分け
realpathコマンドには-eオプションも存在しますが、こちらは実在するファイルのみを対象とするため、用途が大きく異なります。安全性を重視する場合は-e、柔軟性や事前処理を重視する場合は-mを選択するという使い分けが重要になります。
この違いを理解しておくことで、エラー回避や意図しない動作の防止につながり、より信頼性の高いスクリプトを作成できるようになります。
Linuxコマンド学習としての重要性
realpath -mの理解は、単なるコマンド知識にとどまらず、Linuxにおけるファイルシステムの構造理解にもつながります。絶対パスと相対パスの違いや、ディレクトリ階層の扱いをしっかり理解することで、より高度なシェルスクリプトやシステム運用にも対応できるようになります。
初心者の方でも、このような基本コマンドを丁寧に理解していくことで、着実にスキルを積み上げていくことができます。特に実務で役立つコマンドとして、realpathは優先的に習得しておきたい内容のひとつです。
生徒
realpath -mを使うと、存在しないファイルでも絶対パスが取得できるっていうのが一番印象に残りました。最初はちょっと不思議でしたけど、正規化っていう考え方で理解できました。
先生
そうですね。パスを整理して扱うという考え方は、Linuxではとても重要です。特にスクリプトを書くときには、入力されたパスがどんな形でも正しく処理できるようにする必要があります。
生徒
-eオプションとの違いも理解できました。存在確認をするかしないかで使い分けるんですね。
先生
その通りです。目的によってオプションを選ぶことが大切です。今回のように、まだ作られていないファイルのパスを扱う場合は-mが最適ですね。
生徒
実際の開発でも使えそうなので、今度スクリプトを書くときに使ってみます。
先生
ぜひ試してみてください。こうした基本コマンドをしっかり使いこなせるようになると、Linuxの操作が一気に効率化されますよ。