シェルスクリプトでファイル名や拡張子名を取得する - Linux シェルスクリプト プログラミング

PROGRAM


シェルスクリプトでファイル名や拡張子名を取得する

ディレクトリ名とファイル名とに分離する

Linux シェル (sh) では次のようにして、変数に格納された文字列から "ファイル名" と "ディレクトリ名" を取得できる様子です。

#!/bin/sh

 

# FILEPATH 変数にファイルのパスが格納されているとします。

FILEPATH="/etc/httpd/httpd.conf"

 

# FILEPATH から拡張子を含むファイル名を取得します。

FILENAME=${FILEPATH##*/}

 

# FILEPATH からディレクトリ名を取得します。

DIRNAME=${FILEPATH%/*}

このようにすることで、FILENAME 変数には拡張子を含むファイル名が、DIRNAME 変数にはファイル名を除いたディレクトリ名が格納されます。

ここで使用している ## や % といった記号は、変数の値を調整するオプションのようで、次の意味合いを持っています。

#パターン 変数値の先頭から、パターンがもっとも短く一致した部分を取り除きます。
##パターン 変数値の先頭から、パターンがもっとも長く一致した部分を取り除きます。
%パターン 変数値の末尾から、パターンがもっとも短く一致した部分を取り除きます。
%%パターン 変数値の末尾から、パターンがもっとも長く一致した部分を取り除きます。

これにより、例えば "拡張子を含むファイル名の取得" であれば、パターンが "##*/" なので、変数値の先頭から "任意の文字列 + /" というパターンのもっとも長く一致した部分、すなわち、先頭から最後の "/" が現れたところまでを取り除いた、残りのファイル名と拡張子を示す文字列が取得されます。

また、"ディレクトリ名の取得" であれば、パターンが "%/*" なので、変数値の末尾から "/ + 任意の文字列" というパターンのもっとも短く一致した部分、すなわち、末尾から探して最初に現れる "/" のところまでを取り除いた、残りのパスを示す文字列が取得されます。

ファイル名と拡張子とを分離する

同様にして、先ほど "FILENAME" 変数に取得した拡張子を含むファイル名を使用すれば、拡張子を除いたファイル名と拡張子とに分離することができます。

#!/bin/sh

 

# 先ほど取得した FILENAME から、拡張子を除いたファイル名を取得します。

FILENAME_WITHOUT_EXT=${FILENAME%.*}

 

# 先ほど取得した FILENAME から、拡張子を取得します。

EXTNAME=${FILEPATH##*.}

"拡張子を除いた名前を取得" する場合であれば、パターンが "%.*" なので、変数値の末尾から ". + 任意の文字列" というパターンのもっとも短く一致した部分、すなわち、末尾から探して最初に現れる "." のところまでを取り除いた、拡張子を除いたファイル名を示す文字列が取得されます。

同様にして、"拡張子のみを取得" する場合であれば、パターンが "##*." なので、変数値の先頭から "任意の文字列 + ." というパターンのもっとも長く一致した部分、すなわち、先頭から最後の "." が現れたところまでを取り除いた、残りの拡張子を示す文字列が取得されます。


[ もどる ]