カレントディレクトリ名を取得する4つの方法

 シェルスクリプトを書いていると、カレントディレクトリ名は必要だが、pwdコマンドから返される完全なパスは必要ないことがよくある。本稿では、カレントディレクトリだけを抜き出す方法を4通り紹介する。

basenameを使う

 basenameコマンドは、カレントディレクトリ名を抜き出す最も簡単で単純な方法だ。

basename /usr/local/bin
bin

 ただし、ディレクトリ変数を使うシェルスクリプトでは、この方法は役に立たない。この場合は、pwdをバッククォート(`)で囲んでbasenameと併用することで、変数に対応できる。

cd /usr/local/bin
basename `pwd`
bin

echoとパラメータ置換を使う

 bashスクリプト言語は、変数を操作したり拡張したりできるパラメータ置換などの心憎いトリックを満載している。${var##pattern}構文のパラメータ置換を使うと、$varから、$varの先頭から$patternに一致する最長の部分を削除できる。具体的には、次のように使用する。

cd /var/log/squid
echo ${PWD##*/}
squid

 PWDは現在のパスが格納される環境変数であり、##*/までの間にあるものをすべて削除することを意味する。つまり、最後の/までのすべてが削除されて、最後の文字列1つだけが残る。前の例では、この文字列がカレントディレクトリのsquidである。パラメータ置換やその他の変数の操作方法については、「Advanced Bash-Scripting Guide」に詳しい解説がある。

awkとrevを使用する

 さらに精巧なソリューションとして、awk(パターンスキャンユーティリティ)とrev(ファイルまたはstdinからの各行の文字を逆に並べるユーティリティ)を組み合わせる方法がある。

cd /usr/share/cups/data
pwd | rev | awk –F \/ '{print $1}' | rev
data

 このようなスクリプトは、ステップごとに操作の結果を見ると理解しやすい。

pwd
/usr/share/cups/data
pwd | rev
atad/supc/erahs/rsu/
pwd | rev | awk –F \/ '{print $1}'
atad
pwd | rev | awk –F \/ '{print $1}' | rev
data

 awkの-Fオプションは、”/”を区切り文字としてフィールド単位に分離することを意味する。その後で、1つ目のフィールドをプリントする。

sedを使う

 pwdからの出力をシステムエディタsedで精巧な正規表現を使って解析できる。この方法は学習には役立つが、実用的ではない。

cd /home/smith/music
pwd | sed 's,^\(.*/\)\?\([^/]*\),\2,'
music

 操作をわかりやすく説明するため、”(“などの特殊文字に必要なエスケープ文字(\)を省くことにする。

sed 's,^(.*/)?([^/]*),\2,'

 sedのsコマンドは、文字列を別の文字列に置き換える。ここで探す2つのパターンは、最初のカンマと2番目のカンマの間に指定する。最初のパターン(^(.*/)?)は、行の先頭(^)から最後に現れる”/”までを取得する(この例では/home/smith/が一致する)。2番目のパターン(([^/]*))は、見つかったパターンから”/”文字を除くすべてを取得する(角かっこの中が”^”で始まるのが除外を意味する)。結果として、/home/smith/musicの2つが取得される。この正規表現の2番目の部分は、\2で表される置換である。sedでは、これは後方参照と呼ばれる。名前でわかるとおり、これは後戻りして前に使用された参照を呼び戻す。後方参照は9つあり、\1、\2、\3…といった名前を持つ。前の例では、\2は見つかった2番目のパターンを参照する。つまり、musicである。期待どおりの結果だ。

 以上のように、Linuxではディレクトリ名を見つける方法がいくつもある。同じ仕事のために多数の選択肢があることは、Linuxの長所だ。

Sergio Gonzalez DuranはLinux管理者やシステム開発者、またネットワークセキュリティのカウンセラーとして活動しながら、各種Linux講座での指導や、 Linuxおよびオープンハウス関連のスペイン語WebサイトLinuxtotal.com.mxの公開も手がけている。

Linux.com 原文