dirname --multipleオプション|複数のパスをまとめて処理する方法
生徒
「先生、たくさんのファイルの場所(パス)から、フォルダ名だけを一気に取り出す方法ってありますか?」
先生
「それならdirnameコマンドの--multipleオプションを使うのが便利ですよ。」
生徒
「--multipleって何をしてくれるんですか?」
先生
「複数のパスを一度に処理して、それぞれのディレクトリ部分だけを一覧で表示してくれるんですよ。」
1. dirnameコマンドの--multipleオプションとは?
dirnameコマンドの--multipleオプションは、Linuxで複数のパス(ファイルやディレクトリの場所)を一括で処理するときに使います。通常のdirnameは1つのパスしか処理できませんが、--multipleを使えば、複数の入力に対してそれぞれのディレクトリ部分を一行ずつ出力してくれます。
この機能を使うことで、大量のファイルパスから一括でフォルダ名だけを取り出すことができるため、スクリプト処理やログ解析、ファイル整理などにとても役立ちます。
2. 基本的な使い方の例
まずは、複数のパスをまとめて入力するために、改行された文字列(パス一覧)をdirname --multipleに渡してみましょう。
dirname --multiple
/home/user/docs/file.txt
/home/user/images/pic.jpg
/home/user/music/song.mp3
(Enterで実行)
/home/user/docs
/home/user/images
/home/user/music
このように、標準入力(キーボードなど)から複数のパスを入力し、それぞれのディレクトリ部分が1行ずつ表示されます。
3. echoと組み合わせて使う
手動で打つより、スクリプトなどで扱う場合は、echoコマンドと改行コードを使って組み合わせるのが便利です。
echo -e "/a/b/c/file1.txt\n/x/y/z/file2.log" | dirname --multiple
/a/b/c
/x/y/z
この方法では、スクリプトや処理の中でファイルリストを事前に準備しておき、効率よくディレクトリ名だけを取り出すことができます。
4. xargsとの組み合わせ
Linuxのコマンドでは、xargsと組み合わせるとさらに柔軟に使えます。例えば、findコマンドで見つけた複数のファイルのディレクトリを一括抽出するには、次のように書きます。
find . -name "*.log" | dirname --multiple
./logs
./var/log
./tmp
このように--multipleを使うことで、1つずつdirnameに渡す必要がなくなり、処理がとても簡単になります。
5. --zeroと--multipleの組み合わせ
もし、ファイル名の中にスペース(空白)が含まれている場合は、--zeroオプションと一緒に使うことで、より安全に処理ができます。
--zeroは、パスの区切りに改行ではなく「ヌル文字(\0)」を使うため、特殊な名前のファイルでも正確に認識できます。
find . -name "*.mp4" -print0 | dirname --zero --multiple
./videos
./videos/movie
./backup
このように、複数ファイルの処理+安全性を両立したいときに便利です。
6. dirname --multipleの注意点
Linux環境によっては、古いバージョンのdirnameでは--multipleオプションが使えない場合があります。そのときは、以下のようにxargsと組み合わせる方法で代用しましょう。
echo -e "/a/b/file1\n/c/d/file2" | xargs -n1 dirname
/a/b
/c/d
この方法も同様に複数パスを一括処理できますが、ファイル名にスペースがあると誤動作する可能性があるため注意しましょう。
7. basenameとの違いも理解しよう
dirnameが「フォルダ部分」を取り出すのに対して、basenameは「ファイル名部分」だけを取り出します。両者を使い分けることで、パスの加工処理がとても楽になります。
basename /home/user/test.log
test.log
dirnameとbasenameを組み合わせて処理するスクリプトを書くときは、それぞれの役割をきちんと理解しておきましょう。
まとめ
今回は、Linuxのディレクトリ操作において非常に強力な助っ人となるdirnameコマンドの--multipleオプションについて詳しく解説してきました。 通常、dirnameコマンドといえば「ファイルパスからディレクトリ部分だけを抜き出す」というシンプルな役割を持っていますが、実務の現場では、処理したいファイルが1つだけであることは稀です。 大量のログファイル、バックアップデータ、あるいはソースコードの山から、それぞれの格納先フォルダを一括で特定したい場面が多々あります。
そんな時に、この--multipleオプションが真価を発揮します。
標準入力から流れてくる複数のパス文字列を、まるでベルトコンベアのように次々と処理し、余計な手間をかけずに結果を返してくれます。
これまで、ループ処理(for文やwhile文)を書いて1行ずつ処理していた手間が、このオプション一つで解決するのは驚きですよね。
今回学んだ重要ポイントの整理
記事の内容をおさらいするために、特に意識しておきたいポイントをまとめました。 これらをマスターすれば、シェルスクリプトの作成やコマンドラインでの作業効率が格段にアップします。
- 一括処理の実現: --multipleを使えば、改行区切りの複数パスを一度に変換できる。
- パイプとの相性: findコマンドやlsコマンドの結果をそのまま渡して処理を自動化できる。
- 安全性の確保: スペースを含むファイル名には、--zeroオプションを併用することで誤動作を防げる。
- 代替手段の知識: 万が一環境が古くオプションが使えない場合は、xargsを使って代用する柔軟性も大切。
実践的なサンプルプログラム
より具体的なイメージを掴むために、複数のログファイルの場所を一括で表示し、その重複を排除して「どのディレクトリにログがあるか」だけを確認する応用技を見てみましょう。 実務では、このように他のコマンド(sortやuniq)と組み合わせることが非常に多いです。
echo -e "/var/log/nginx/access.log\n/var/log/nginx/error.log\n/var/log/mysql/error.log" | dirname --multiple | sort | uniq
/var/log/mysql
/var/log/nginx
この一行のコマンドだけで、バラバラのファイルパスから「親ディレクトリのリスト」をきれいに整理して取り出すことができました。 これは、サーバーの調査やメンテナンス時に非常に重宝するテクニックです。
また、ルート権限が必要なシステム領域のディレクトリを確認する場合も、使い方は全く同じです。 例えば、設定ファイルが置かれているパスをまとめて確認する際は、以下のように実行します。
echo -e "/etc/ssh/sshd_config\n/etc/nginx/nginx.conf" | dirname --multiple
/etc/ssh
/etc/nginx
Linuxシステムを管理する上で、パス操作は基本中の基本です。 dirnameコマンドの引数を一つずつ指定するのではなく、標準入力から流し込むという「Linuxらしい」考え方に慣れることで、あなたのスキルは初心者レベルから一歩抜け出すことができるでしょう。
生徒
「先生、今回のdirname --multipleの使い道、すごくイメージが湧きました!これって、たくさんのファイルがあるときに、いちいちコマンドを何回も打たなくて済むから、指が疲れなくていいですね(笑)」
先生
「ははは、確かに指の疲れも減りますが、それ以上に『間違いが減る』のが最大のメリットですよ。手作業でパスを一つずつコピーして貼り付けていたら、どこかでフォルダ名を削りすぎたり、入力を間違えたりするリスクがありますからね。」
生徒
「なるほど、正確性が上がるんですね。さっきのサンプルで、最後にsortやuniqを使ってたのもカッコよかったです。ディレクトリ名だけを取り出した後、さらに整理できるのが便利そう!」
先生
「そうなんです。Linuxのコマンドは、一つひとつは単純な機能しか持っていませんが、それらをパイプ(|)でつなぐことで、魔法のように複雑な処理ができるようになります。dirname --multipleは、その『つなぎ役』として非常に優秀なんですよ。」
生徒
「あと、もし自分の使っているLinuxが古くて--multipleが効かなかったら、どうすればいいんでしたっけ?」
先生
「良い質問ですね。その場合は、xargsを使いましょう。xargs -n1 dirnameという書き方を覚えれば、--multipleがない環境でも同じような動きを再現できます。ただ、最近の主要な配布版(UbuntuやCentOSなど)であれば、基本的には--multipleが使えるはずですよ。」
生徒
「わかりました!まずは自分の環境で試してみます。スペースが入ったファイル名には注意が必要っていうのも、忘れずにメモしておきますね。先生、ありがとうございました!」
先生
「ぜひ活用してください。次はbasenameの一括処理についても挑戦してみると、パス操作の達人にさらに近づけますよ。頑張ってくださいね!」