概要
パスから末尾要素を除き、親ディレクトリ側の文字列を返します。設定ファイルの配置元や、スクリプト自身の近くにある資源を扱う時の基準作りに向きます。
基本構文
dirname 文字列...
dirname -z 文字列...詳細解説
dirnameは、パス文字列の末尾要素を取り除き、ディレクトリ部分だけを返すコマンドです。/var/log/syslogなら/var/log、/usr/bin/bashなら/usr/binを返します。basenameと対になる道具として理解すると覚えやすいです。
実務では、スクリプトが置かれたディレクトリの近くにある設定や補助ファイルを探す時、出力先ディレクトリを組み立てる時、パスの親側だけをログへ出したい時に役立ちます。シェルの文字列展開でも書けますが、dirnameを使うと意図が明確になります。
ただしdirnameも実体確認は行いません。文字列として親ディレクトリ部分を計算するだけなので、そこが本当に存在するか、相対パスなのか、シンボリックリンクを含むのかは別に考える必要があります。
このコマンドを使う場面
パスから親側の文字列を取り出したい時、スクリプトの基準ディレクトリを計算したい時、保存先のディレクトリ名だけを別に扱いたい時に使います。
まず安全に試す方法
1. dirname /var/log/syslog
2. dirname /usr/bin/bash
3. dirname ./config/app.yml
結果が存在確認ではなく、文字列としての親側抽出であることを確認してください。
3分ミッション
少しでも手を動かすと定着しやすくなります。終わった項目にチェックを入れてください。
-
絶対パスと相対パスでdirnameの結果を比較します。
-
realpathで正規化した結果にdirnameを適用し、文字列処理と実体解決の違いを確認します。
資格試験との関連
-
LinuC レベル1
範囲: 1.02.2 基本的なファイル管理の実行根拠: officialdirnameは、LinuCレベル1の基本的なファイル管理を理解するうえで重要なコマンドです。
-
LPIC-1
範囲: 103.3 基本的なファイル管理の実行根拠: officialdirnameは、LPIC-1のファイルとディレクトリの基本操作に関わる代表的なコマンドです。
-
共通基礎
範囲: Linuxコマンド基礎根拠: editorialdirnameは、ファイル操作またはテキスト処理の基本を支えるため、試験横断の共通知識として価値があります。
実行結果サンプル
-
dirname /var/log/syslog/var/log -
dirname ./config/app.yml./config
戻り値コード
- 0 正常終了。結果を出力できました。
- >0 引数不足や不正なオプション指定などで失敗しました。
使用例
dirname /var/log/syslogdirname /usr/bin/bashdirname ./config/app.yml
よくあるエラー
-
dirnameの結果が実体パスだと思っていた 原因: dirnameは文字列処理であり、正規化や存在確認はしません。対処: 必要ならrealpathで正規化してからdirnameへ渡します。
-
相対パスの基準を見失った 原因: 現在位置を意識せずに相対パスを扱っています。対処: pwdで基準を確認し、必要なら絶対パスへ変換してから処理します。
導入・互換性情報
POSIXでdirnameは標準化されています。GNU実装では-zなどの拡張があります。末尾スラッシュや空に近い入力の扱いは、記事では必ず実際に確認しながら説明するのが安全です。
注意点 / セキュリティリスク
危険度は低いですが、文字列上の親ディレクトリと、実際に正規化した実体パス上の親ディレクトリは一致しないことがあります。相対パスやシンボリックリンクを含む時はreadlinkやrealpathの併用を検討してください。
FAQ
-
Q. basenameとの違いは何ですか。 A. basenameは末尾要素を返し、dirnameは親ディレクトリ部分を返します。
-
Q. 存在しないパスでも使えますか。 A. はい。文字列として計算するため、実体がなくても結果は返ります。
参照リンク
- カテゴリー: File And Directory
- レベル: Basic
- 対応試験: LinuC, LinuC レベル1, LPIC, LPIC-1, 共通基礎