bashでファイル名、拡張子、ディレクトリ名を取得

部分一致

フルパスのファイル名に対してパターンを指定することで、パスの一部を取得できます。

#!/bin/env bash
#
fullpath=/path/to/a.b.txt
echo $fullpath
filename=${fullpath##*/}
echo $filename
extname=${fullpath##*.}
echo $extname
dirname=${fullpath%/*}
echo $dirname

実行結果:

/path/to/a.b.txt
a.b.txt
txt
/path/to

後方一致で拡張子を順番に削除していく処理も便利です。

#!/bin/env bash
#
fullpath=/path/to/a.b.txt
echo $fullpath
filename=${fullpath##*/}
echo $filename
filename=${filename%.*}
echo $filename
filename=${filename%.*}
echo $filename

実行結果:

/path/to/a.b.txt
a.b.txt
a.b
a

前方一致には#を使い、後方一致には%を使います。覚えておくと便利です。

記述方法削除動作fullpath=/path/to/a.b.txt結果
${変数名#パターン}前方一致(最短)${fullpath#*/}path/to/a.b.txt
${変数名##パターン}前方一致(最長)${fullpath##*/}a.b.txt
${変数名%パターン}後方一致(最短)${fullpath%.*}/path/to/a.b
${変数名%%パターン}後方一致(最長)${fullpath%%.*}/path/to/a

コマンドの利用

ファイル名とディレクトリ名の取得には、basenameとdirnameコマンドが直感的には分り易いです。

#!/bin/env bash
#
fullpath=/path/to/a.b.txt
echo $fullpath
filename=`basename $fullpath`
echo $filename
dirname=`dirname $fullpath`
echo $dirname

実行結果:

/path/to/a.b.txt
a.b.txt
/path/to

まとめ

ファイル名やディレクトリ名の取得方法には、部分一致による変数展開と、basenameやdirnameコマンドを用いる方法があります。慣れると便利なのは部分一致による方法です。