部分一致
フルパスのファイル名に対してパターンを指定することで、パスの一部を取得できます。
#!/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コマンドを用いる方法があります。慣れると便利なのは部分一致による方法です。