はじめに
こんにちは!今回はdirnameコマンドについて解説します。
dirnameはファイルパスからディレクトリパス部分だけを抽出するコマンドです。先ほど解説したbasenameの逆バージョンって感じですね。
シェルスクリプトでパスを処理する時に、basenameとセットで超よく使われるコマンドです!
dirnameコマンドとは
dirnameは、フルパスやファイルパスからディレクトリパスの部分だけを取り出す外部コマンドです。
例えば、/home/user/documents/file.txtというパスが与えられたとき、dirnameは/home/user/documentsだけを抽出します。ファイルのディレクトリパスだけが必要な場合に重宝するコマンドです。
基本構文
|
|
パスはファイルやディレクトリのパスです。
主なオプション
| オプション | 説明 |
|---|---|
-z |
出力をNUL文字で区切る(GNU拡張) |
使用例
例1: 基本的なパスからディレクトリを抽出
|
|
実行結果:
|
|
フルパスから/home/user/documentsというディレクトリパスだけを取り出します。これが基本的な使い方です。
例2: 相対パスでの利用
|
|
実行結果:
|
|
相対パスでも同じようにディレクトリパスだけを抽出できます。
例3: ファイル名だけが与えられた場合
|
|
実行結果:
|
|
ディレクトリ情報がない場合は、カレントディレクトリを意味する.を返します。
例4: ルートディレクトリの場合
|
|
実行結果:
|
|
ルートに近いパスでも正しくディレクトリを抽出します。
例5: スラッシュで終わるパス
|
|
実行結果:
|
|
パスがスラッシュで終わっていても正しく処理されます。
例6: スクリプト内での利用
|
|
実行結果:
|
|
スクリプト内で変数に結果を格納して使用できます。
例7: ダブルスラッシュの処理
|
|
実行結果:
|
|
複数のスラッシュがあっても、そのまま処理されます。
例8: パイプでの利用
|
|
実行結果:
|
|
他のコマンドと組み合わせて使用できます。
例9: basename と組み合わせ
|
|
実行結果:
|
|
dirnameとbasenameを組み合わせてパスを分解できます。
例10: 複雑なパスの処理
|
|
実行結果:
|
|
./や../を含むパスでも、そのまま処理されます。
Tips・注意点
basename コマンドとセット
dirnameはbasenameと逆の処理をします。パスを分解する時は両方を組み合わせるのが定番です。
|
|
パス正規化には非対応
dirnameは./や../を含むパスをそのまま処理します。正規化(相対パスの解決)には対応していません。
|
|
正規化したい場合はrealpathコマンドを使いましょう。
連続実行で1つ上のディレクトリを取得
|
|
dirnameを連続実行することで、複数階層上のディレクトリを取得できます。
実践的な使い方
スクリプトの配置ディレクトリを取得
|
|
スクリプトがどのディレクトリに配置されているか取得する時に便利です。
ファイルを同じディレクトリにコピー
|
|
別の場所にあるファイルを、元ファイルと同じディレクトリにコピーする時に使えます。
ログファイルを出力ディレクトリに配置
|
|
入力ファイルと同じディレクトリにログファイルを出力する例です。
まとめ
dirnameコマンドのポイント:
- ファイルパスからディレクトリパスだけを抽出する基本コマンド
basenameと組み合わせてパスを分解できる- スクリプト内で
$(dirname パス)として使用できる - ファイル名だけが与えられた場合は
.を返す - パス正規化には対応していない
- よく使う組み合わせ:
dirname "$file"、dirname "$(readlink -f "$0")"
シェルスクリプトを書くなら、dirnameとbasenameは必須セットですよ!