Linux basename コマンド

Linux 命令大全Linux コマンド大全


basename コマンドとは

basenameLinux システム上でシンプルですが実用的なコマンドラインツールで、ファイルパスからファイル名部分を抽出するために使用します。パス解析器のようなもので、ディレクトリ情報を取り除き、最後のファイル名だけを保持します。

類推による理解:完全な郵送先住所(例:「中国/北京市/海淀区/中关村大街1号」)を想像してください。basenamebasename の機能は、最後の「中关村大街1号」の部分だけを抽出することです。


basename コマンドの基本構文

basename [选项] 路径 [后缀]

パラメータの説明

  1. パス(必須):処理対象の完全なパス文字列
  2. サフィックス(省略可能):指定すると、結果からこのサフィックスを削除します。

よく使うオプション

オプション 説明
-a 複数のパスを引数としてサポート
-s 后缀 指定したサフィックスを削除(コマンド末尾にサフィックス引数を追加するのと同じ)
-z 出力結果をヌル文字で区切る(改行の代わり)

基本的な使用例

例1:基本ファイル名の抽出

例

$ basename /home/user/documents/report.txt
report.txt

例2:ファイル拡張子の削除

例

$ basename /home/user/documents/report.txt .txt
report

例3:複数のファイルを処理する(-a オプションを使用)

例

$ basename -a /path/to/file1.txt /another/path/file2.log
file1.txt
file2.log

実際の使用シーン

シーン1:ファイル拡張子の一括処理

例

for file in *.jpg; do
    mv "$file" "$(basename "$file" .jpg).png"
done

解説:このスクリプトは、現在のディレクトリ内のすべての .jpg ファイルを .png ファイルにリネームし、拡張子だけを変更して元のファイル名を保持します。

シーン2:スクリプト内で現在のスクリプト名を取得する

例

#!/bin/bash
SCRIPT_NAME=$(basename "$0")
echo "スクリプト実行中:$SCRIPT_NAME"

シーン3:find コマンドと組み合わせて使用する

例

find /var/log -name "*.log" -exec basename {} \;

機能:/var/log ディレクトリ内のすべての .log ファイルを検索し、ファイル名のみを表示します(パスは含みません)


よくある質問と回答

Q1: basename と dirname の違いは何ですか?

コマンド 機能 入力例 出力例
basename パスの最後の部分を抽出 /a/b/c.txt c.txt
dirname ディレクトリ部分を抽出 /a/b/c.txt /a/b

Q2: basename コマンドが動作しないのはなぜですか?

よくある原因:

  1. パスに特殊文字(スペースなど)が含まれているのに引用符で囲んでいない

    • 誤り:basename /path/with spaces/file
    • 正しい:basename "/path/with spaces/file"
  2. スクリプト内で変数を使用する際に引用符で囲んでいない

    • 誤り:basename $filepath
    • 正しい:basename "$filepath"

上級テクニック

テクニック1:複数のサフィックスを処理する

例

$ basename archive.tar.gz .gz
archive.tar
$ basename archive.tar.gz .tar.gz
archive

テクニック2:パイプで使う

例

echo "/usr/local/bin/python" | xargs basename

出力:python

テクニック3:パラメータ展開を使った代替方法

Bash では、パラメータ展開を使って同様の機能を実現することもできます:

例

path="/home/user/file.txt"
filename="${path##*/}"  # basename と同等
echo "$filename"

Linux 命令大全Linux コマンド大全

その他の拡張