今回はLinuxコマンドであるbasenameコマンドについて解説します
ファイル名等をピックアップできるので、意外と実用的なコマンドです
ぜひ覚えて帰ってくださいね!
※注 本文の△は半角スペースに置き換えてください。わかりやすくするために△で記述してます
basenameコマンドとは??
basenameコマンドは、「/」後のファイルやディレクトリのパス名から文字列を表示するコマンドです
主にスクリプト作成時やファイル操作でパスからファイル名のみを抽出したい場合に非常に便利です
basenameコマンドの主なオプション
basenameコマンドは実用的なオプションがあります
-a (–multiple)
複数の引数を同時に処理するオプション
複数のパスを一度に処理したい場合に使用します
basename△-a△/path/to/file1.txt△/path/to/file2.txt
-s (–suffix=SUFFIX)
指定した接尾辞(拡張子等)を削除するオプション
複数のファイルで同じ拡張子を一括削除したい場合に便利です
basename△-s△.txt△/path/to/file.txt
basename△-a△-s△.log△*.log
-z (–zero)
出力の各行を改行文字ではなくNULL文字で区切るオプション
ファイル名に空白文字が含まれている場合の安全な処理に使用します
basename△-z△”/path/to/file△with△spaces.txt”
ファイルやディレクトリの一番最後の「/」以降の文字を表示
basenameコマンドでは、ファイルやディレクトリの一番最後の「/」以降の文字を表示します
「basename△/home/tmp/grep.txt」とコマンドを入力すると、「grep.txt」が画面表示されます
拡張子を含めたくない場合
「basename△パス名△拡張子」と入力すると拡張子を含めずファイル名を画面表示できるようになります
例えば「basename△/home/tmp/grep.txt△.txt」とコマンド入力すると拡張子を除いた「grep」が画面表示されます
①basename△パス名
パス名からファイル名、ディレクトリ名を取り出す
②basename△`pwd`
カレントディレクトリの最後の「/」以降のディレクトリ名を取得
③basename△$(pwd)
カレントディレクトリの最後の「/」以降のディレクトリ名を取得(`pwd`と同義)
④basename△パス名△拡張子
拡張子を除きパス名からファイル名を取り出す
実際のコマンド実行結果が以下です
basenameコマンドの実用的な活用例
実際の現場でよく使われるbasenameコマンドの活用例をご紹介します
シェルスクリプトでの活用
シェルスクリプト内でファイル処理を行う際によく使用されます
#!/bin/bash
for△file△in△*.txt;△do
△△filename=$(basename△”$file”△.txt)
△△echo△”Processing:△$filename”
△△cp△”$file”△”backup_${filename}.bak”
done
# 全txtファイルをbackup_ファイル名.bakにコピー
バッチ処理での活用
複数ファイルの一括処理で威力を発揮します
ls△/var/log/*.log△|△while△read△logfile;△do
△△name=$(basename△”$logfile”△.log)
△△gzip△”$logfile”
△△mv△”${logfile}.gz”△”/backup/${name}_$(date△+%Y%m%d).log.gz”
done
# ログファイルを圧縮して日付付きでバックアップ
ファイル形式変換での活用
ファイル形式を変換する際のファイル名処理に便利です
for△img△in△*.png;△do
△△name=$(basename△”$img”△.png)
△△convert△”$img”△”${name}.jpg”
△△echo△”Converted△$img△to△${name}.jpg”
done
# PNGファイルをJPGに一括変換
ログ解析での活用
ログファイルの解析作業でファイル名を動的に取得する場合に使用します
logfile=”/var/log/apache2/access.log”
service_name=$(basename△”$logfile”△.log)
error_count=$(grep△”ERROR”△”$logfile”△|△wc△-l)
echo△”${service_name}:△${error_count}△errors△found”
# ログファイル名からサービス名を抽出してエラー数をレポート
dirnameコマンドとの違い
basenameと対になるdirnameコマンドとの違いを理解しておきましょう
filepath=”/home/user/documents/report.txt”
basename△”$filepath”
# 結果: report.txt(ファイル名部分)
dirname△”$filepath”
# 結果: /home/user/documents(ディレクトリ部分)
basename△”$filepath”△.txt
# 結果: report(拡張子を除いたファイル名)
高度な使用例
より複雑な処理でのbasenameコマンドの活用例です
ネストしたループでの活用
for△dir△in△/data/*/;△do
△△dirname=$(basename△”$dir”)
△△echo△”Processing△directory:△$dirname”
△△for△file△in△”$dir”*.csv;△do
△△△△filename=$(basename△”$file”△.csv)
△△△△python△process.py△”$file”△”output/${dirname}_${filename}.json”
△△done
done
# ディレクトリごとにCSVファイルを処理してJSON出力
条件分岐での活用
process_file()△{
△△local△filepath=”$1″
△△local△filename=$(basename△”$filepath”)
△△local△extension=”${filename##*.}”
△△local△basename_no_ext=$(basename△”$filepath”△”.$extension”)
△△case△”$extension”△in
△△△△txt)
△△△△△△echo△”Text△file:△$basename_no_ext”
△△△△△△;;
△△△△log)
△△△△△△echo△”Log△file:△$basename_no_ext”
△△△△△△;;
△△△△*)
△△△△△△echo△”Unknown△file△type:△$filename”
△△△△△△;;
△△esac
}
# ファイル拡張子に応じた処理分岐
basenameコマンドの効率的な使い方
大量のファイルを処理する際のパフォーマンス向上のコツです
# 1. -aオプションで複数ファイルを一度に処理
basename△-a△/path/to/*.txt
# 2. -sオプションで拡張子を一括削除
basename△-a△-s△.txt△*.txt
# 3. シェルのパラメータ展開も活用可能
filename=”${filepath##*/}”
# basenameと同様の結果だが高速
# 4. 大量ファイル処理はxargsと組み合わせ
find△/data△-name△”*.log”△-print0△|△xargs△-0△basename△-a△-s△.log
よく使われるパターン集
実際の作業でよく遭遇するパターンをまとめました
# 1. 現在のディレクトリ名を取得
current_dir=$(basename△$(pwd))
# 2. スクリプト自身の名前を取得
script_name=$(basename△”$0”)
# 3. ファイル名から拡張子を除去
name_only=$(basename△”$filename”△.${filename##*.})
# 4. 複数拡張子に対応した除去
basename△file.tar.gz△.tar.gz
# 5. 配列との組み合わせ
files=(/path/to/*.txt)
for△file△in△”${files[@]}”;△do
△△names+=($(basename△”$file”△.txt))
done
トラブルシューティング
basenameコマンド使用時によくある問題と解決法です
スペースを含むファイル名の処理
# 問題のあるコード
basename△/path/to/file△with△spaces.txt
# 正しいコード
basename△”/path/to/file△with△spaces.txt”
# シェル変数使用時
filename=”/path/to/file△with△spaces.txt”
basename△”$filename”
空の値やNULL値の処理
safe_basename()△{
△△local△filepath=”$1″
△△if△[△-n△”$filepath”△];△then
△△△△basename△”$filepath”
△△else
△△△△echo△”Error:△Empty△filepath”△>&2
△△△△return△1
△△fi
}
まとめ
いかがでしたでしょうか
今回はbasenameコマンドについてまとめてみました
basenameコマンドはパスからファイル名を抽出するLinuxの基本コマンドですが、シェルスクリプトやバッチ処理において非常に重要な役割を果たします
特にファイル操作の自動化、ログ処理、一括変換処理などで威力を発揮します
dirnameコマンドと組み合わせることで、より柔軟なパス操作が可能になるので、ぜひ両方マスターしてください!