はじめに

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

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

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

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

パス文字列から、ファイル名、ディレクトリ名、拡張子の部分のみを抽出するサンプル
#!/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をご確認ください。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

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

ご注意

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


まさにこれだ
7 (58%)
ちょっと違う
3 (25%)
これじゃない
2 (17%)

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