はじめに

こんにちは!今回はbasenameコマンドについて解説します。

basenameはファイルパスからファイル名だけを抽出するコマンドです。フルパスが与えられたときに、最後のファイル名部分だけが欲しい時に超便利ですね。

スクリプトを書く時に頻繁に出てくるコマンドなので、これを機にマスターしちゃいましょう!

basenameコマンドとは

basenameは、フルパスやファイルパスからファイル名の部分だけを取り出す外部コマンドです。

例えば、/home/user/documents/file.txtというパスが与えられたとき、basenamefile.txtだけを抽出します。シェルスクリプトの中で、ディレクトリパスに関係なくファイル名だけを処理したい時に重宝するコマンドです。

基本構文

1
basename パス [サフィックス]

パスはファイルのパス、サフィックス(省略可)は除外したい拡張子です。

主なオプション

オプション 説明
-a 複数のパス引数をすべて処理(GNU拡張)
-s サフィックスを指定(GNU拡張)
-z 出力をNUL文字で区切る(GNU拡張)

使用例

例1: 基本的なパスからファイル名を抽出

1
basename /home/user/documents/file.txt

実行結果:

1
file.txt

フルパスからfile.txtというファイル名だけを取り出します。これが基本的な使い方です。

例2: 拡張子を除外する

1
basename /home/user/documents/file.txt .txt

実行結果:

1
file

第2引数に.txtを指定することで、拡張子を除外してfileだけを取り出します。

例3: シンプルなファイル名を処理

1
basename document.pdf

実行結果:

1
document.pdf

既にファイル名だけが与えられた場合は、そのまま返します。

例4: ディレクトリパスも処理

1
basename /var/log/system.log

実行結果:

1
system.log

どんなディレクトリ階層からでも、ファイル名だけを取り出します。

例5: サフィックス指定で拡張子削除

1
basename /etc/config/app.conf .conf

実行結果:

1
app

特定の拡張子だけを削除することができます。

例6: スクリプト内での利用

1
2
3
4
#!/bin/bash
file="/home/user/photos/vacation.jpg"
name=$(basename "$file")
echo "ファイル名は: $name"

実行結果:

1
ファイル名は: vacation.jpg

スクリプト内で変数に結果を格納して使用できます。

例7: パイプでの利用

1
echo "/home/user/files/test.txt" | xargs basename

実行結果:

1
test.txt

他のコマンドと組み合わせて使用できます。

例8: 複数ファイルの処理(GNU拡張)

1
basename -a /path/file1.txt /path/file2.txt

実行結果:

1
2
file1.txt
file2.txt

GNU版のbasenameでは-aオプションで複数のファイルを一度に処理できます。

例9: サフィックス指定と組み合わせ(GNU拡張)

1
basename -s .log /var/log/application.log

実行結果:

1
application

GNU拡張の-sオプションでサフィックスを指定します。

例10: 複雑なパスの処理

1
basename /home/user/./documents/../file.txt

実行結果:

1
file.txt

./../を含むパスでも、最終的なファイル名を抽出します。

Tips・注意点

dirname コマンドとセット

basenameと反対に、ディレクトリパスだけを抽出したい時はdirnameコマンドを使います。

1
2
3
4
5
6
7
# basename: ファイル名を抽出
basename /home/user/file.txt
# 結果: file.txt

# dirname: ディレクトリを抽出
dirname /home/user/file.txt
# 結果: /home/user

スクリプト内での定番パターン

ファイルを処理するスクリプトで、パス情報が必要ない場合はbasenameを使うパターンが定番です。

1
2
3
4
for file in /var/log/*.log; do
  name=$(basename "$file")
  echo "処理中: $name"
done

古いSystem V版とGNU版の違い

Linux環境ではGNU版が使われることが多く、-s-aオプションが使えます。BSDやmacOSではオプションが異なることがあるので注意です。

実践的な使い方

ログファイルの処理

1
2
3
4
5
#!/bin/bash
for logfile in /var/log/*.log; do
  logname=$(basename "$logfile" .log)
  echo "ログファイル: $logname を処理しています"
done

ログファイルのパスから拡張子を除いたファイル名を取り出して処理する例です。

ファイルコピー時のリネーム

1
2
3
4
source_file="/home/user/documents/report.pdf"
dest_dir="/backup/"
filename=$(basename "$source_file")
cp "$source_file" "$dest_dir/$filename"

ソースファイルのパスから名前だけを抽出して、別のディレクトリにコピーする時に便利です。

dirnameと組み合わせたパス処理

1
2
3
4
5
full_path="/home/user/projects/myapp/config.ini"
directory=$(dirname "$full_path")
filename=$(basename "$full_path")
echo "ディレクトリ: $directory"
echo "ファイル: $filename"

パスを分解して、ディレクトリとファイル名を別々に処理する例です。

まとめ

basenameコマンドのポイント:

  • ファイルパスからファイル名だけを抽出する基本コマンド
  • 第2引数で拡張子や特定の接尾辞を除外できる
  • スクリプト内で$(basename パス)として使用できる
  • dirnameコマンドと組み合わせるとパス処理が強力
  • よく使う組み合わせ: basename "$file" .txtdirname "$file"

シェルスクリプトを書くなら、basenamedirnameは必須の知識ですよ!