連載
» 2018年01月25日 05時00分 公開

Linux基本コマンドTips(177):【 basename 】コマンド――パス名からファイル名を取得する

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、パス名からディレクトリ部分を除いたファイル名を取得する「basename」コマンドです。

[西村めぐみ,@IT]
「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、パス名からディレクトリ部分を除いたファイル名を取得する「basename」コマンドです。

basenameコマンドとは?

 「basename」は、ディレクトリ名とファイル名を含むパス名(/mydir/myfileなど)から、ディレクトリ部分を除き、ファイル名だけを取得するコマンドです。

 ファイル名の末尾の文字(拡張子など)を指定して取り除くこともできます。

 basenameと対になるコマンドもあります。dirnameコマンドです。dirnameはパス名からディレクトリ部分だけを取得します。



basenameコマンドの書式

basename [オプション] パス名

basename パス名 [接尾辞]

※[ ]は省略可能な引数を示しています。




basenameの主なオプション

短いオプション 長いオプション 意味
-a --multiple 引数を複数取り、各引数を処理する(「-a パス名1 パス名2 パス名3」のように指定)
-s=文字列 --suffix=文字列 ファイル名の末尾から指定した文字列(接尾辞)を削除する
-z --zero 改行しない(出力行の末尾を改行文字ではなくNULL文字にする)


パス名からファイル名を取得する

 「basename パス名」で、パス名からファイル名を取り出します。パス名は、ディレクトリ名とファイル名を含みます。

 正確には「パスの最後のスラッシュ(/)より後ろを取り出し、末尾がスラッシュの場合はその1つ前の部分を取り出す」というコマンドです(画面1) ※1。このため「basename /usr/bin」または「basename /usr/bin/」と実行した場合の結果は、「bin」となります。

※1 ただし、「basename /」の結果は「/」となる。



コマンド実行例

basename パス名

(パス名からディレクトリ名部分を取り除いて表示する)(画面1


画面1 画面1 パス名からファイル名を取り出したところ

 basenameが活躍する場面として、「シェルスクリプトの中でスクリプトファイル名を取得する」というものがあります。シェルスクリプトについては、“応用力”をつけるためのLinux再入門の第21回を参照してください。

 シェルスクリプトの中では「$0」でスクリプトファイル名を得ることができます(画面2)。結果には起動時のパス全体が含まれていますから、「basename $0」としてファイル名だけを取得できます。

画面2 画面2 シェルスクリプト内でbasenameコマンドを用いた例


ファイル名から接尾辞を取り除く

 「basename パス名 接尾辞」で、パス名から得たファイル名に対して、さらに指定した接尾辞を取り除いたものを取得できます。「接尾辞」には、ファイル名の末尾から取り除きたい文字列を指定します ※2。

 末尾に「接尾辞」として指定した文字列がない場合はファイル名全体をそのまま表示します(画面3の3番目の実行例)。

※2 接尾辞としてファイル名全体を指定した場合は、ファイル名を返す。



コマンド実行例

basename パス名 接尾辞

(パス名からディレクトリ名と接尾辞を取り除いて表示する)(画面3


画面3 画面3 パス名から得たファイル名に対して接尾辞を取り除いたところ ※3

※3 2番目の実行例の場合、指定した接尾辞「~」がホームディレクトリのパスに展開(チルダ展開)されないよう、"~"と指定している。ファイル名の一部に「*」を含む場合も同様に対応できる。





複数のパス名を一度に処理する

 複数のパス名を処理したい場合は「-a」を使用します。

 以下のコマンド実行例では、locateコマンドを使いました。まず「locate .log」でパス名に「.log」を含むファイルを探してします。次にxargsコマンドで「basename -a ファイルのリスト」を実行しました(コマンド実行例の1番目)。

 locateコマンドは「locate 文字列」で「指定した文字列をパスの一部に含むもの」全てを表示します。拡張子「.log」のファイル、としたい場合はgrepコマンドで絞り込むとよいでしょう(コマンド例2)。

 表示件数が多いため、実行例ではheadコマンドで出力の先頭部分だけを表示しています。

コマンド実行例

locate .log | xargs basename -a

(パス名に「.log」を含むファイルを探し、ファイル名を出力する)(画面4

locate .log | grep .log$ | xargs basename -a

(パス名の末尾が「.log」となっているファイル名を出力する)(画面4


画面4 画面4 複数のパス名を一度に処理したところ 2番目の実行例はファイルの末尾に「.log」を含むファイルだけを対象としたため、1番目の実行結果とは出力が異なる。


筆者紹介

西村 めぐみ(にしむら めぐみ)

PC-9801NからのDOSユーザー。PC-486DX時代にDOS版UNIX-like toolsを経てLinuxへ。1992年より生産管理のパッケージソフトウェアの開発およびサポート業務を担当。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。2011年より、地方自治体の在宅就業支援事業にてPC基礎およびMicrosoft Office関連の教材作成およびeラーニング指導を担当。


Copyright © ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。