dirnameコマンドは、ファイルのフルパスでのディレクトリ部分を取り出すことができます。
ファイルがある場所に移動をするのに利用することができます。
目次
dirnameコマンドとは
dirnameコマンドは、ファイル名の最後の部分を取り除くことができます。つまり、ファイル名のフルパスの中でファイル部分の文字列を取り除き、ディレクトリ部分を取り出すことができます。
dirnameコマンドとは別にファイル部分を取り出したい場合は、basenameコマンドが利用できます。ファイルのパスがわかっている場合、dirnameコマンドを利用して、ファイルがある場所に移動し、basenameコマンドでそのファイルに対して、コマンドの実行を行うようなことができます。
dirnameコマンドの利用例
ファイル名のディレクトリ部分を取り出す
dirnameコマンドは、ファイルパスが与えられるとファイル部分の文字列を取り除き、ディレクトリ部分を出力します。
コマンド例
1 |
dirname $file |
$fileの内容
1 |
/home/ubuntu/test_dirname/file.txt |
実行結果
1 |
/home/ubuntu/test_dirname |
コマンド例
1 |
file=$(readlink -f file.txt) |
または
1 |
file=$(realpath file.txt) |
複数のファイルを指定
dirnameコマンドは、複数のファイルを指定することができます。
コマンド例
1 |
dirname $file $file |
$fileの内容
1 |
/home/ubuntu/test_dirname/file.txt |
実行結果
1 2 |
/home/ubuntu/test_dirname /home/ubuntu/test_dirname |
ルートディレクトリに向かって再帰的にディレクトリを表示
(シェルスクリプト)
dirnameコマンドで取得したパスにもう一度dirnameコマンドを利用すると、一番下の階層のディレクトリ部分の文字列が取り除かれ、一つ上の部分までのディレクトリを表示します。
コマンド例
1 |
dirname $(dirname $file) |
$fileの内容
1 |
/home/ubuntu/test_dirname/file.txt |
dirname $fileの結果
1 |
/home/ubuntu/test_dirname |
実行結果
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 |
$fileの内容
1 |
/home/ubuntu/test_dirname/file.txt |
実行結果
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 |
$fileの内容
1 |
/home/ubuntu/test_dirname/file.txt |
実行結果
1 2 3 4 |
/home/ubuntu/test_dirname /home/ubuntu /home / |
dirnameコマンドは、処理結果も分かりやすく、シェルスクリプトを記述する練習にはちょうどいいコマンドだと思います。
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版