パス文字列からファイル名などを抜き出す

  • 33
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。
# ファイル名を取り出す(拡張子あり)
basename '/a/b/c.d.e'
# c.d.e

# ファイル名を取り出す(拡張子なし)
basename '/a/b/c.d.e' .e
# c.d

dirname '/a/b/c.d.e'
# /a/b

パタンマッチを使うと・・・

${変数#パターン}   # 先頭から最短一致した部分を取り除く
${変数##パターン}  # 先頭から最長一致した部分を取り除く
${変数%パターン}   # 末尾から最短一致した部分を取り除く
${変数%%パターン}  # 末尾から最長一致した部分を取り除く

こんな感じでも記述が出来る。

#!/bin/bash
fpath='/a/b/c.d.e'

# ファイル名を取り出す(拡張子あり)
faname_ext="${fpath##*/}"
echo $fname_ext
# c.d.e

# ファイル名を取り出す(拡張子なし)
fname="${fname_ext%.*}"
echo $fname
# c.d

# 拡張子を取り出す
fext="${fpath##*.}"
echo $fext
#e

# ディレクトリを取り出す
fdir="${fpath%/*}"
echo $fdir
# /a/b

### -------------------------------
### ちょっと応用
### -------------------------------
# 拡張子を変更する
echo "${fpath%.*}.x"
# /a/b/c.d.x

参考:
ザリガニが見ていた...。