【 dirname 】コマンド――パス名からディレクトリ部分を取得するLinux基本コマンドTips(178)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、パス名からディレクトリ部分を取得する「dirname」コマンドです。

» 2018年01月26日 05時00分 公開
[西村めぐみ@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、今回は、パス名からディレクトリ部分を取得する「dirname」コマンドです。

dirnameコマンドとは?

 「dirname」は、ディレクトリ名とファイル名を含むパス名(/mydir/myfileなど)から、ディレクトリ部分だけを取得するコマンドです。

 ファイル名だけを取得するには、basenameコマンド(連載第177回)を使います。



dirnameコマンドの書式

dirname [オプション] パス名 ……

※[ ]は省略可能な引数を示しています。




dirnameの主なオプション

短いオプション 長いオプション 意味
-z --zero 改行しない(出力行の末尾を改行文字ではなくNULL文字にする)


パス名からディレクトリ部分を取得する

 「dirname パス名」でパス付きのファイル名からディレクトリ名部分を取得します。例えば「dirname /dir1/file.txt」ならば「/dir1」、「dirname /dir1/dir2/file.txt」であれば「/dir1/dir2」となります。

 dirnameは、正確には「パスの最後のスラッシュ(/記号)以降を取り除く」動作をします ※1。このため「dirname /usr/bin/」または「dirname /usr/bin」と指定して実行した場合の結果は「/usr」となります。

※1 ただし、「dirname /」の結果は「/」となる。指定したパスがディレクトリ部分を含んでいない場合は「.」となる。



 dirnameは例えば、whichコマンドで取得した外部コマンドのフルパスを加工する際に役立ちます。「dirname `which コマンド名`」のように指定することで、見つけたコマンドのディレクトリ名部分だけを取得できます。

 なお、CentOS環境ではwhichコマンドでエイリアスも表示するように設定されているため、実行例では「\which」のようにバックスラッシュを付け、エスケープして実行しています(連載第97回 alias/unalias「コマンド名と同じ名前のエイリアス」)。

 「which」で実行するとエイリアス設定されているwhichコマンドを実行します。しかし「\which」や「"which"」のようにバックスラッシュや引用符を付けて実行することで、エイリアスされていない、いわば「素の状態」のwhichコマンドを実行できます。

コマンド実行例

dirname パス名

(パス名からディレクトリ部分を抜き出して表示する)(画面1

dirname `which コマンド名`

(外部コマンドが位置するディレクトリの名前を表示する)(画面1


画面1 画面1 パス名からディレクトリ部分を取り出したところ


複数のパス名を一度に処理する

 dirnameコマンドとbasenameコマンドは使い方が似ています。しかし、dirnameコマンドはbasenameコマンドと違い、オプションを付けなくても複数のパス名を一度に処理できます。

 以下のコマンド実行例では、locateコマンドを使っています。まず「locate .log」でパス名に「.log」を含むファイルを探します。次にgrepコマンドで末尾が「.log」のものだけを絞り込んでいます。最後に拡張子が「.log」となっているファイルに対して、xargsコマンドで「dirname ファイルのリスト」を実行しています(コマンド実行例の1番目)。

 例えば/var/logには複数の「.log」ファイルがあるので、同じディレクトリを複数出力します。そこで、sortコマンドに「-u」を付けて重複を取り除いています ※2。

 なお、1つ目の実行例では表示件数が多いため、実行例ではheadコマンドを使って、実行結果の先頭部分だけを表示しています。

※2 locateコマンドで出力した場合、同じディレクトリに属するファイルがまとまって得られる。そこでsortコマンドを使って並べ替え、重複を取り除くのではなく、uniqコマンドで重複を取り除いても問題ないだろう。



コマンド実行例

locate .log | grep .log$ | xargs dirname

(パス名に「.log」を含むファイルを探し、ディレクトリ部分を出力する)(画面2

locate .log | grep .log$ | xargs dirname | sort -u

(パス名の末尾が「.log」となっているファイルを探し、重複を取り除きながらディレクトリ部分を出力する)(画面2


画面2 画面2 複数のパス名を一度に処理したところ


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。