【シェル】パス文字列からディレクトリ部、ファイル名を取得する

By | 2015年4月25日

シェルスクリプトを書いていて、
・パス文字列からディレクトリ部分だけを取得したい
・パス文字列からファイル名だけを取得したい
といったことは良くある。その方法を見ていこう。

パス文字列からディレクトリ部を取得する

・方法1 dirnameコマンドを使う

STR=/home/zawata/filename
echo $(dirname ${STR})

結果:/home/zawata

dirnameコマンドを使い、渡された文字列のディレクトリ部を取得するやり方である。

・方法2 パラメータ展開を使う

STR=/home/zawata/filename
echo ${STR%/*}

結果:/home/zawata

${parameter%word}と書くと、指定されたパラメータから
『wordのパターンに最短で後方一致する部分』を削除した値を得ることができる。
ここではwordに「/*」を指定しているので、パス文字列のうち、ファイル名部分がマッチする。

/home/zawata/filename ←赤文字部分がマッチし、削除される。

このようにすることで、ディレクトリ部を取得できる。

パス文字列からファイル名を取得する

・方法1 basenameコマンドを使う

STR=/home/zawata/filename
echo $(basename ${STR})

結果:filename
basenameコマンドを使い、渡された文字列のファイル名を取得できる。

・方法2 パラメータ展開を使う

STR=/home/zawata/filename
echo ${STR##*/}

結果:filename

${parameter##word}と書くと、指定されたパラメータから
『wordのパターンに最長で前方一致する部分』を削除した値を得ることができる。
ここではwordに「*/」を指定しているので、パス文字列のうち、ディレクトリ部分がマッチする。

/home/zawata/filename ←赤文字部分がマッチし、削除される。

このようにすることで、ファイル名を取得できる。

まとめ

以上をまとめたスクリプトを示す。

#!/bin/bash

STR="/home/zawata/filename"

# パス文字列からディレクトリ部を取得する
# 方法1. dirnameコマンドを使う
echo $(dirname ${STR})

# 方法2. パラメータ展開を使う
echo ${STR%/*}


# パス文字列からファイル名を取得する
# 方法1. basenameコマンドを使う
echo $(basename ${STR})

# 方法2. パラメータ展開を使う
echo ${STR##*/}

結果:
/home/zawata
/home/zawata
filename
filename

補足 パラメータ展開の覚え方

パラメータ展開の書き方は、記号の種類と数が色々とあってややこしい。
今回出てきたパラメータ展開の書き方に限っては、こんな風に覚えておくといいかもしれない。
・${parameter%word}の覚え方
パーセント記号はキーボード上で見ると「右側」にある。1つだけなので「短い」。
だから、「右側から最短で一致したパターン」を削除する。

・${parameter##word}の覚え方
シャープ記号はキーボード上で見ると「左側」にある。2つあるので「長い」。
だから、「左側から最長で一致したパターン」を削除する。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です