dirname コマンド

パス名からディレクトリ部分を出力します。

概要

dirname コマンドはパス名から最後のコンポーネントを削除し、ディレクトリパスのみを残します。シェルスクリプトでファイルパスからディレクトリ部分を抽出するために一般的に使用され、特定のディレクトリへの移動や同じ場所にあるファイルを処理する際に便利です。

オプション

--zero, -z

各パス名の後に改行ではなくゼロバイト(ASCII NUL)を出力します。

$ dirname -z /usr/bin/zip
/usr/bin$

--help

ヘルプ情報を表示して終了します。

$ dirname --help
Usage: dirname [OPTION] NAME...
Output each NAME with its last non-slash component and trailing slashes
removed; if NAME contains no /'s, output '.' (meaning the current directory).

  -z, --zero     end each output line with NUL, not newline
      --help     display this help and exit
      --version  output version information and exit

Examples:
  dirname /usr/bin/          -> "/usr"
  dirname dir1/str dir2/str  -> "dir1" followed by "dir2"
  dirname stdio.h            -> "."

--version

バージョン情報を出力して終了します。

$ dirname --version
dirname (GNU coreutils) 9.0
Copyright (C) 2021 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie.

使用例

基本的な使い方

$ dirname /usr/bin/zip
/usr/bin

複数の引数

$ dirname /usr/bin/zip /etc/passwd /home/user/file.txt
/usr/bin
/etc
/home/user

カレントディレクトリ

$ dirname file.txt
.

シェルスクリプトでの使用

$ script_dir=$(dirname "$0")
$ echo "This script is located in: $script_dir"
This script is located in: /path/to/script/directory

ヒント:

basename と組み合わせる

dirnamebasename を一緒に使用して、パスをディレクトリとファイル名のコンポーネントに分割できます:

$ path="/home/user/documents/report.pdf"
$ dir=$(dirname "$path")
$ file=$(basename "$path")
$ echo "Directory: $dir, File: $file"
Directory: /home/user/documents, File: report.pdf

スペースを含むパスの処理

スペースを含むパスを正しく処理するために、dirname を使用する際は常に変数を引用符で囲みます:

$ path="/home/user/my documents/report.pdf"
$ dir=$(dirname "$path")  # 引用符が重要
$ echo "$dir"
/home/user/my documents

cd と一緒に使用する

cd と組み合わせてファイルのディレクトリに移動できます:

$ cd "$(dirname "/path/to/file.txt")"

よくある質問

Q1. パスなしでファイル名を渡すと、dirname は何を返しますか?

A. .(カレントディレクトリ)を返します。

Q2. dirname は一度に複数のパスを処理できますか?

A. はい、複数の引数を渡すことができ、それぞれを個別に処理します。

Q3. dirname は末尾のスラッシュをどのように処理しますか?

A. パスを処理する前に末尾のスラッシュを削除します。

Q4. dirnamebasename の違いは何ですか?

A. dirname はパスのディレクトリ部分を返し、basename はファイル名部分を返します。

参考文献

https://www.gnu.org/software/coreutils/manual/html_node/dirname-invocation.html

改訂履歴