コマンド
basename
パス名+ファイル名からパス名を削除する
basename コマンドは、「パス名+ファイル名 からパス名を削除するコマンド」である。言い方を変えると、「与えられた文字列の最後の / 以降を表示するコマンド」である。
●basename コマンドの基本的な使い方
% basename /usr/local/bin/vi
vi
% basename /hoge/fuga
fuga
% basename /hoge/fuga/
fuga
⇒ 最後が / で終わっている場合は、その直前の文字列を表示する
ファイルが実際に存在するかどうかは basename はチェックしない。単に文字列を加工し、結果を出力するだけのコマンドである。
●拡張子を削除する
basename コマンドに 2つ目の引数を渡すと、その文字列を削除した結果を返してくれる。
とすると、foo.datから.datを削除したものを表示する。これを使って、
% foreach i ( *.c.org )
foreach? cp $i `basename $i .org`
foreach? end
とすると、DOS でいう
が実現できる (foreach は csh・tcsh のみ。sh・bash は for を使うこと)。これと同じことを basename を使わず行うこともできる。foreach・for の説明を参照。
●複数ファイルに対する basename
少なくとも FreeBSD の basename コマンドは、複数のファイル (複数の引数) を対象とすることができるため、
% basename foo/bar/*.txt
a1.txt
a2.txt
a3.txt
や
% find /etc/ -type f | xargs basename | head
devfs.conf
csh.cshrc
libmap.conf
BSD.lib32.dist
(略)
といったことが可能である。
Linux の basename は、1つのファイルしか対象とできないため、下記のように 1コマンドで 1ファイルを対象としなければならない。
% find /etc/ -type f -exec basename {} \;
●basename コマンドの使いみち
basename コマンドの使いみちはは以下のようなものが考えられる。
- シェルスクリプトで $0 に入っている /foo/bar/mycommand や ./mycommand という文字列から "mycommand" だけを抽出したい場合。例えばヘルプメッセージで
Usage: mycommand [-abx] [targets ...]
と表示するとか、ログに "mycommand" とだけ表示したい場合。
- ファイル名 hoge.conf を元に hoge.dat を生成したい場合
- cp や mv などにおいて、hoge から hoge.bak などと別の拡張子を付与したい場合