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を組み合わせて処理するスクリプトを書くときは、それぞれの役割をきちんと理解しておきましょう。