dirnameは、与えられたパス名からディレクトリ部分を取り出すためのコマンドです。主に
シェルスクリプトの中で利用され、パス文字列を操作する際に役立ちます。具体的には、指定されたパスの最後のスラッシュ(/)以降の部分を取り除き、その結果を標準出力に出力します。
dirnameの基本的な動作
dirnameコマンドは、以下のような動作を行います。
パス名の最後のスラッシュ(/)以降の部分を削除します。
パス名にスラッシュが含まれていない場合、現在のディレクトリを表す「.」を出力します。
パス名の末尾がスラッシュで終わっている場合、最後のスラッシュは無視され、その直前のディレクトリ名を出力します。
ルートディレクトリ(/)が入力された場合は、そのまま「/」を出力します。
例えば、以下の例のように動作します。
bash
$ dirname /home/carpetsmoker/docs/base.wiki
/home/carpetsmoker/docs
$ dirname /home/carpetsmoker/docs/
/home/carpetsmoker
$ dirname base.wiki
.
$ dirname /
/
使用上の注意点とパフォーマンス
dirnameは、与えられた文字列を1つのオペランドとしてのみ受け付けます。そのため、複数のパス名を処理する場合には、ループ処理の中で何度もdirnameコマンドを呼び出す必要があり、これはパフォーマンスの低下につながる可能性があります。例えば、以下のようなスクリプトは、入力行ごとに新しいプロセスを生成してしまうため、効率的ではありません。
bash
while read path;
do
dirname "$path"
done < paths.txt
この問題を回避するためには、シェル組み込みの機能や変数展開を利用した方が効率的な場合があります。例えば、bashでは`${path%/
}`のようなパラメータ展開を利用することで、dirnameコマンドと同等の処理をシェル内部で実行できます。
また、関連するパス名に対する処理も、dirnameコマンドの動作とは異なる場合があるので注意が必要です。
bash
path=/path/to/some/file/
echo "${path%/}" # /path/to/some/file を出力
echo "$(dirname "$path")" # /path/to/some を出力
関連事項
basename: dirnameとは対照的に、パス名の最後の要素(ファイル名またはディレクトリ名)を取り出すコマンドです。
パス (コンピュータ): ファイルやディレクトリの場所を示す文字列です。
UNIXユーティリティの一覧: UNIX系オペレーティングシステムで提供される様々なコマンドラインツールの一覧です。
参考資料
dirname: return the directory portion of a pathname –
The Open Group Base Specifications Issue 7, 2018 edition "Shell and Utilities"
dirnameコマンドは、パス名操作の基本となるツールであり、
シェルスクリプトを記述する上で非常に重要な役割を果たします。効率的な利用を心がけることで、より高速かつ洗練されたスクリプトを作成できます。