シェルスクリプトでパス文字列からファイル名/ディレクトリ名/拡張子を抽出する

対象プラットフォーム: FreeBSD 8.x
(下記手順を2014/05/01にFreeBSD 8.4-RELEASEで確認済み)


はじめに

シェルスクリプトを書いていると、ファイル名を含むパス文字列から、ファイル名や、ディレクトリ名、拡張子の部分のみを抽出したいケースによく遭遇します。

このページでは、これらの文字列の抽出方法について説明します。

早速サンプルのシェルスクリプト

ファイル名を含むパス文字列から、ファイル名や、ディレクトリ名、拡張子の部分のみを抽出するのは、かなり容易です。
早速サンプルをご紹介します。

パス文字列から、ファイル名、ディレクトリ名、拡張子の部分のみを抽出するサンプル
#!/bin/sh

test_path="/usr/local/etc/apache/httpd.conf"

string_filename=${test_path##*/}
string_filename_without_extension=${string_filename%.*}
string_path=${test_path%/*}
string_extension=${test_path##*.}

echo ${string_filename}
echo ${string_filename_without_extension}
echo ${string_path}
echo ${string_extension}

この実行結果は以下の通りです。

実行結果
httpd.conf
httpd
/usr/local/etc/apache
conf

何でこれで動くのか、納得がいかない方向けに説明すると、「${test_path##*/}」は「*/」で表される文字列の最長一致接頭部分の除去を、「${test_path%/*}」は「/*」で表される最短一致接尾部分の除去をするからです。

元の文字列「${test_path}」が「/usr/local/etc/apache/httpd.conf」ですので、「${test_path##*/}」では「*/」にマッチする最長の接頭部分「/usr/local/etc/apache/」が削除され、結果として「httpd.conf」が残ります。
また、「${test_path%/*}」は「/*」にマッチする最短の接尾部分「/httpd.conf」が削除され、結果として「/usr/local/etc/apache」が残ります。

詳しくは「sh」のmanをご確認ください。


あなたの探し物は見つかりましたか?
まさにこれだ 参考になった ちょっと違う これじゃない
何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。


目次に戻る
image