Linux dirname コマンド
dirname コマンドとは
dirnameLinux/Unix システムにおいて、シンプルですが実用的なコマンドラインツールで、ファイルパスからディレクトリ部分を抽出するために使用します。パス内の親ディレクトリを手動で文字列解析することなく、素早く取得するのに役立ちます。
基本機能
- 入力: 1つのファイルパス文字列
- 出力: そのパスのディレクトリ部分(最後のスラッシュより後ろを除いた内容)
コマンド構文
dirname [选项] 文件名...
パラメータ説明
- ファイル名: 1つまたは複数のファイルパスを指定可能(絶対パスと相対パスをサポート)
- **...**:複数のファイルパスを同時に処理できることを示します
オプションパラメータ
ほとんどの場合、dirnameオプションは不要ですが、GNU 版では以下の標準オプションをサポートしています:
| オプション | 説明 |
|---|---|
-z |
出力を改行文字ではなく NUL 文字(\0)で区切ります |
--help |
ヘルプ情報を表示 |
--version |
バージョン情報を表示 |
動作原理
dirnameコマンドは以下の手順でパスを処理します:
- パス末尾のすべてのスラッシュ(/)を削除
- 最後のスラッシュとその後のすべての文字を削除
- 結果が空の場合は "."(現在のディレクトリ)を出力
処理フローチャート

使用例
基本用法
例
$ dirname /home/user/docs/file.txt
/home/user/docs
$ dirname relative/path/to/file
relative/path/to
/home/user/docs
$ dirname relative/path/to/file
relative/path/to
複数ファイルの処理
例
$ dirname /a/b/c.txt /x/y/z.txt
/a/b
/x/y
/a/b
/x/y
特殊なパスの処理
例
$ dirname /usr/bin/ # 末尾のスラッシュに注意
/usr
$ dirname file.txt # ファイル名のみ
.
$ dirname / # ルートディレクトリ
/
/usr
$ dirname file.txt # ファイル名のみ
.
$ dirname / # ルートディレクトリ
/
スクリプトでの使用
例
#!/bin/bash
# スクリプトが置かれているディレクトリを取得
SCRIPT_DIR=$(dirname "$0")
echo "スクリプトディレクトリ:$SCRIPT_DIR"
# 設定ファイルパスのディレクトリを取得
CONFIG_PATH="/etc/app/config.cfg"
CONFIG_DIR=$(dirname "$CONFIG_PATH")
echo "設定ディレクトリ:$CONFIG_DIR"
# スクリプトが置かれているディレクトリを取得
SCRIPT_DIR=$(dirname "$0")
echo "スクリプトディレクトリ:$SCRIPT_DIR"
# 設定ファイルパスのディレクトリを取得
CONFIG_PATH="/etc/app/config.cfg"
CONFIG_DIR=$(dirname "$CONFIG_PATH")
echo "設定ディレクトリ:$CONFIG_DIR"
よくある使用シーン
1. スクリプトのディレクトリを取得
例
#!/bin/bash
# スクリプトが置かれている絶対パスを取得
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "スクリプトのディレクトリ:$SCRIPT_DIR"
# スクリプトが置かれている絶対パスを取得
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
echo "スクリプトのディレクトリ:$SCRIPT_DIR"
2. 相対パスの構築
例
# ファイルが特定のディレクトリのサブディレクトリにあると仮定します
BASE_DIR="/var/log"
FULL_PATH="$BASE_DIR/app/error.log"
# ログディレクトリを取得
LOG_DIR=$(dirname "$FULL_PATH")
BASE_DIR="/var/log"
FULL_PATH="$BASE_DIR/app/error.log"
# ログディレクトリを取得
LOG_DIR=$(dirname "$FULL_PATH")
3. basename と組み合わせて使用
例
# 完全なパスを分解
FULL_PATH="/home/user/docs/report.pdf"
DIR=$(dirname "$FULL_PATH")
FILE=$(basename "$FULL_PATH")
echo "ディレクトリ:$DIR"
echo "ファイル名:$FILE"
FULL_PATH="/home/user/docs/report.pdf"
DIR=$(dirname "$FULL_PATH")
FILE=$(basename "$FULL_PATH")
echo "ディレクトリ:$DIR"
echo "ファイル名:$FILE"
注意事項
シンボリックリンク:dirnameシンボリックリンクは解決されません。解決するには、readlinkを使用します
例
dirname "$(readlink -f "/path/with/symlink")"
スペースの処理: パスにスペースが含まれる場合は、引用符を使用してください
例
dirname "/path/with spaces/file.txt"
相対パス: 出力結果は相対パスの形式を維持します
例
$ dirname ../parent/file.txt
../parent
../parent
空の入力: 引数が指定されない場合、GNU 版は "." を出力しますが、これは POSIX 標準の動作ではありません
類似コマンドとの比較
| コマンド | 機能 | 入力例 | 出力例 |
|---|---|---|---|
dirname |
ディレクトリ部分を抽出 | /a/b/c.txt | /a/b |
basename |
ファイル名部分を抽出 | /a/b/c.txt | c.txt |
realpath |
絶対パスを取得(シンボリックリンクを解決) | ../file | /full/path/to/file |
実践演習
テストファイルを作成し、そのディレクトリパスを取得する
例
touch /tmp/testfile
dirname /tmp/testfile
dirname /tmp/testfile
自身が置かれているディレクトリを表示するスクリプトを作成
例
#!/bin/bash
echo "本スクリプトの場所:$(dirname "$0")"
echo "本スクリプトの場所:$(dirname "$0")"
スペースや特殊文字を含むパスの処理を試す
例
mkdir -p "/tmp/my dir"
touch "/tmp/my dir/special file.txt"
dirname "/tmp/my dir/special file.txt"
touch "/tmp/my dir/special file.txt"
dirname "/tmp/my dir/special file.txt"
その他の拡張
Linux コマンド大全