こちらからSWELLを購入できます 詳しくはこちら

【Linux】basenameコマンド完全ガイド 最後の「/」以降の文字列を表示

  • URLをコピーしました!

今回は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コマンドとの違いを理解しておきましょう

basename vs 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コマンドと組み合わせることで、より柔軟なパス操作が可能になるので、ぜひ両方マスターしてください!

 

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次