カレントディレクトリ名を取得する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の公開も手がけている。