realpath -zオプションの使い方|出力をヌル文字で区切るLinuxコマンド解説
生徒
「先生、realpathコマンドってなんですか?それと、-zオプションってどういうときに使うんですか?」
先生
「realpathはファイルやディレクトリの『本当の場所(絶対パス)』を表示してくれるコマンドなんだ。-zオプションは、その出力を特別な文字で区切るために使うんだよ。」
生徒
「特別な文字?改行じゃダメなんですか?」
先生
「うん、改行だと困る場面もあるからね。具体的にどういうときに使うか、一緒に学んでいこう!」
1. realpathコマンドとは?
realpath(リアルパス)コマンドは、Linuxでファイルやディレクトリの「絶対パス(すべての階層を含んだ正確な場所)」を表示するための便利なコマンドです。たとえば、シンボリックリンク(ショートカットのようなもの)を使っていると、本当のファイルの場所が分かりにくくなることがあります。そういったときにrealpathを使うと、実際に存在する正確なパスを表示してくれるのです。
2. -zオプションの意味とは?
-zオプションは、出力の区切り文字を「ヌル文字(NULL文字)」にするオプションです。通常、Linuxコマンドの出力は1行ごとに「改行(Enterキーと同じ)」で区切られますよね。ですが、ファイル名にスペースや改行が含まれていると、処理がうまくいかなくなることがあります。
そこで登場するのが-z。これは、区切り文字を改行ではなく、目に見えない「ヌル文字(\0)」にして、スクリプトや他のコマンドと組み合わせたときに正しく処理できるようにするためのものです。
3. 具体的な使用例を見てみよう
たとえば、カレントディレクトリ(今いる場所)にあるファイルやディレクトリのパスを出力する例です。
realpath -z ./Documents ./Downloads
/home/user/Documents/home/user/Downloads
この出力では、実際には改行の代わりに「\0(ヌル文字)」で区切られています。目に見えませんが、改行ではない特別な記号で区切られているため、後続のコマンドが誤認しにくくなります。
4. xargsやfindと組み合わせて使う実践例
-zオプションが特に活躍するのは、他のコマンドと組み合わせたときです。たとえば、ファイルの一覧をfindで取得して、realpath -zに渡すという使い方が便利です。
find . -name "*.txt" -print0 | xargs -0 realpath -z
このコマンドでは、findで見つかった「.txtファイル」を\0で区切って渡し、realpathがその絶対パスを同じく\0で出力します。こうすることで、スペースや改行を含むファイル名でも安全に処理できます。
5. なぜNULL文字での区切りが必要なの?
通常のファイル名には、スペース・タブ・改行などが含まれることがあります。たとえば、以下のようなファイル名があったとします:
My Document.txt
このようなファイルを改行区切りで処理すると、「My」と「Document.txt」に分かれてしまうおそれがあります。しかし、-zオプションでヌル文字区切りにすれば、そのようなトラブルを避けることができます。
6. realpathと他コマンドの違いにも注目
似たような役割を持つコマンドにreadlinkやpwdがありますが、それぞれ特徴が異なります。
readlink:シンボリックリンクの「リンク先」だけを表示pwd:現在のディレクトリの絶対パスを表示realpath:通常のファイルも含め、絶対パス+正規化されたパスを表示
つまり、realpathはreadlinkとpwdの良いとこ取りのような存在なんです。そこに-zを組み合わせることで、より柔軟な処理が可能になります。
7. -zと組み合わせると便利なオプション
realpathには他にもさまざまなオプションがあります。-zと一緒に使える便利なオプションの例を紹介します。
--relative-to=DIR:指定したディレクトリからの相対パスを出力--canonicalize:余計なパス記号を正規化--no-symlinks:シンボリックリンクを解決せずに表示
例えば、以下のように書くと、ヌル文字で区切りながら相対パスを取得できます。
realpath -z --relative-to=/home/user ./Documents
Documents
8. スクリプトで使うときの注意点
Shellスクリプトでrealpath -zを使うときは、パイプ(|)でつないでxargs -0などと組み合わせることが基本です。ヌル文字区切りに対応したオプションを使わないと、意図しない分割が起こるので注意しましょう。