概要
ファイルパス(ディレクトリを含む文字列)から、ディレクトリ部分を取り除き、最後の「ファイル名」だけを抽出して表示するコマンドです。
主にシェルスクリプトにおいて、ログファイルのパスからファイル名だけを取得したり、バックアップ処理でファイル名を生成したりする際の文字列操作に使用されます。ファイルの実在有無にかかわらず、文字列として処理を行うのが特徴です。
仕様(引数・オプション)
構文
basename 文字列 [接尾辞]
basename [オプション]... 文字列...
主な引数・オプション
| オプション | 説明 |
-a | 複数の引数をファイルパスとして扱い、それぞれのファイル名を表示します(multiple arguments)。 |
-s <接尾辞> | ファイル名の末尾から指定した接尾辞(拡張子など)を取り除きます(suffix)。 |
-z | 出力の区切り文字を改行ではなくヌル文字(\0)にします(zero)。 |
基本の使い方
フルパスを指定して実行すると、ディレクトリ部分が削除されたファイル名のみが出力されます。
コマンド
# フルパスからファイル名を抽出
basename /usr/local/bin/python3
実行結果
python3
実践コマンド
ファイル名から拡張子を取り除く
第2引数に「取り除きたい文字列(拡張子)」を指定するか、-s オプションを使用します。ファイル名だけを変数として扱いたい場合に便利です。
# config.yaml から .yaml を取り除いて表示
basename /etc/app/config.yaml .yaml
# -s オプションを使用する場合(同じ結果)
basename -s .yaml /etc/app/config.yaml
config
複数のパスから一括してファイル名を取り出す
-a オプションを使用すると、引数に複数のパスを指定でき、順番に改行区切りで出力します。
# 複数のパスからファイル名部分だけをリストアップ
basename -a /var/log/syslog /var/log/auth.log
syslog
auth.log
シェルスクリプト内の変数からファイル名を取得する
スクリプト内で定義されたパス変数から、ファイル名だけを切り出して利用する典型的なパターンです。
#!/bin/bash
TARGET_PATH="/var/www/html/index.php"
# 変数からファイル名だけを抽出
FILE_NAME=$(basename "$TARGET_PATH")
echo "処理対象ファイル: $FILE_NAME"
処理対象ファイル: index.php
カスタムポイント
- 拡張子の自動削除: ループ処理などで
basename $file .txtのように使うと、拡張子なしのファイル名を取得でき、変換後のファイル名生成(例:.txt→.bak)に役立ちます。 - dirnameとの対比: ファイル名を取り出す
basenameに対し、ディレクトリパスを取り出すdirnameコマンドがあります。セットで使われることが多いです。
注意点
- 文字列操作のみ:basename は指定されたパスが実在するかどうかを確認しません。単に文字列として「最後のスラッシュより後ろ」を切り出しているだけです。
- 末尾スラッシュの扱い:パスの末尾がスラッシュで終わっている場合(例: /usr/local/)、スラッシュは無視され、その一つ前の要素(local)がファイル名として返されます。
- 引数不足:引数を指定せずに実行するとエラーになります。必ず1つ以上の文字列を渡す必要があります。
応用
ディレクトリ内の全ファイルを別名でバックアップする
basename で拡張子を除いた名前を取得し、日付を付与してコピーするワンライナーです。
# カレントディレクトリの .log ファイルを、ファイル名_日付.bk にリネーム(コピー)
for file in *.log; do
name=$(basename "$file" .log)
cp "$file" "${name}_$(date +%Y%m%d).bk"
done
まとめ
basenameコマンドは、シェルスクリプトにおけるパス操作の基本となるツールです。絶対パスで指定された入力値から、処理に必要な「純粋なファイル名」だけを切り出す場面で必ずと言っていいほど登場します。bashの変数展開機能(${VAR##*/}など)でも代用可能ですが、可読性が高く、dirname と対になって直感的に使えるため、スクリプト初心者から上級者まで広く利用されています。特に拡張子除去機能は、ファイル変換スクリプトを作成する際に非常に効率的です。
