シェルスクリプトでファイル名や拡張子名を取得する - 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##*.}
"拡張子を除いた名前を取得" する場合であれば、パターンが "%.*" なので、変数値の末尾から ". + 任意の文字列" というパターンのもっとも短く一致した部分、すなわち、末尾から探して最初に現れる "." のところまでを取り除いた、拡張子を除いたファイル名を示す文字列が取得されます。
同様にして、"拡張子のみを取得" する場合であれば、パターンが "##*." なので、変数値の先頭から "任意の文字列 + ." というパターンのもっとも長く一致した部分、すなわち、先頭から最後の "." が現れたところまでを取り除いた、残りの拡張子を示す文字列が取得されます。
[ もどる ]