dirnameコマンドは、ファイルのフルパスでのディレクトリ部分を取り出すことができます。
ファイルがある場所に移動をするのに利用することができます。
dirnameコマンドとは
dirnameコマンドは、ファイル名の最後の部分を取り除くことができます。つまり、ファイル名からディレクトリ部分を取り出すことができます。
dirnameコマンドとは対照的にファイル部分を取り出したい場合は、basenameコマンドが利用できます。
ファイルのパスがわかっている場合、dirnameコマンドでディレクトリ部分を、basenameコマンドでファイル部分を取り出せます。
取り出したディレクトリ部分を利用して、そのファイルの場所に移動し、ファイル部分を利用して、何かのコマンドを実行するというようなことができます。
ファイル名のディレクトリ部分を取り出す
dirnameコマンドは、ファイルパスが与えられるとファイル部分の文字列を取り除き、ディレクトリ部分を出力します。
コマンド例
1 |
dirname $file |
変数の内容
1 2 |
$ declare -p file declare -- file="/home/ubuntu/test_dirname/file.txt" |
実行結果
1 |
/home/ubuntu/test_dirname |
ファイルのフルパスを取得するためには、readlinkコマンドやrealpathコマンドが利用することができます。
複数のファイルを指定
dirnameコマンドは、複数のファイルを指定することができます。
コマンド例
1 |
dirname $file $file |
実行結果
1 2 |
/home/ubuntu/test_dirname /home/ubuntu/test_dirname |
ルートディレクトリに向かって再帰的にディレクトリを表示
(シェルスクリプト)
dirnameコマンドで取得したパスにもう一度dirnameコマンドを利用すると、一番下の階層のディレクトリ部分の文字列が取り除かれ、一つ上の部分までのディレクトリを表示します。
コマンド例
1 |
dirname $(dirname $file) |
実行結果
1 |
/home/ubuntu |
この結果からルートディレクトリに向かうまでディレクトリの一覧を表示するシェルスクリプトを作成できます。
rootdirname.sh(シェルスクリプトの例)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#/bin/bash for argv in $@ ; do file=$(dirname $argv) while true ; do echo $file file_z=$file file=$(dirname $file) if [ $file = $file_z ] ; then break fi done done |
コマンド例
1 |
./rootdirname.sh $file |
実行結果
1 2 3 4 |
/home/ubuntu/test_dirname /home/ubuntu /home / |
rootdirname.shの処理は再帰関数でも記述が出来ます。
rootdirname_r.sh(シェルスクリプトの例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#/bin/bash function recursive_dirname() { local file=$(dirname $1) if [ $file = $1 ] ; then return 0 fi echo $file recursive_dirname $file } for argv in $@ ; do recursive_dirname $argv done |
コマンド例
1 |
./rootdirname_r.sh $file |
実行結果
1 2 3 4 |
/home/ubuntu/test_dirname /home/ubuntu /home / |