UNIX/Linuxの部屋 basenameコマンドの使い方

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド basename パス名+ファイル名からパス名を削除する このエントリーをはてなブックマークに追加

basename コマンドは、「パス名+ファイル名 からパス名を削除するコマンド」である。言い方を変えると、「与えられた文字列の最後の / 以降を表示するコマンド」である。



basename コマンドの基本的な使い方
% basename /usr/local/bin/vi
vi
% basename /hoge/fuga
fuga
% basename /hoge/fuga/
fuga
⇒ 最後が / で終わっている場合は、その直前の文字列を表示する

ファイルが実際に存在するかどうかは basename はチェックしない。単に文字列を加工し、結果を出力するだけのコマンドである。

拡張子を削除する
basename コマンドに 2つ目の引数を渡すと、その文字列を削除した結果を返してくれる。
% basename foo.dat .dat
とすると、foo.datから.datを削除したものを表示する。これを使って、
% foreach i ( *.c.org )
foreach? cp $i `basename $i .org`
foreach? end
とすると、DOS でいう
COPY *.c.org *.c
が実現できる (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 などと別の拡張子を付与したい場合

関連コマンド
>> FreeBSDオンラインマニュアル(man) FreeBSD basename(1)
>> Solaris10オンラインマニュアル(man) Solaris10 basename(1)
>> Linuxオンラインマニュアル(man) Linux basename(3)
>> Linuxオンラインマニュアル(man) Linux basename(1)