Linux basename コマンド
basename コマンドとは
basenameLinux システム上でシンプルですが実用的なコマンドラインツールで、ファイルパスからファイル名部分を抽出するために使用します。パス解析器のようなもので、ディレクトリ情報を取り除き、最後のファイル名だけを保持します。
類推による理解:完全な郵送先住所(例:「中国/北京市/海淀区/中关村大街1号」)を想像してください。basenamebasename の機能は、最後の「中关村大街1号」の部分だけを抽出することです。
basename コマンドの基本構文
basename [选项] 路径 [后缀]
パラメータの説明
- パス(必須):処理対象の完全なパス文字列
- サフィックス(省略可能):指定すると、結果からこのサフィックスを削除します。
よく使うオプション
| オプション | 説明 |
|---|---|
-a |
複数のパスを引数としてサポート |
-s 后缀 |
指定したサフィックスを削除(コマンド末尾にサフィックス引数を追加するのと同じ) |
-z |
出力結果をヌル文字で区切る(改行の代わり) |
基本的な使用例
例1:基本ファイル名の抽出
例
$ basename /home/user/documents/report.txt
report.txt
report.txt
例2:ファイル拡張子の削除
例
$ basename /home/user/documents/report.txt .txt
report
report
例3:複数のファイルを処理する(-a オプションを使用)
例
$ basename -a /path/to/file1.txt /another/path/file2.log
file1.txt
file2.log
file1.txt
file2.log
実際の使用シーン
シーン1:ファイル拡張子の一括処理
例
for file in *.jpg; do
mv "$file" "$(basename "$file" .jpg).png"
done
mv "$file" "$(basename "$file" .jpg).png"
done
解説:このスクリプトは、現在のディレクトリ内のすべての .jpg ファイルを .png ファイルにリネームし、拡張子だけを変更して元のファイル名を保持します。
シーン2:スクリプト内で現在のスクリプト名を取得する
例
#!/bin/bash
SCRIPT_NAME=$(basename "$0")
echo "スクリプト実行中:$SCRIPT_NAME"
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 コマンドが動作しないのはなぜですか?
よくある原因:
パスに特殊文字(スペースなど)が含まれているのに引用符で囲んでいない
- 誤り:
basename /path/with spaces/file - 正しい:
basename "/path/with spaces/file"
- 誤り:
スクリプト内で変数を使用する際に引用符で囲んでいない
- 誤り:
basename $filepath - 正しい:
basename "$filepath"
- 誤り:
上級テクニック
テクニック1:複数のサフィックスを処理する
例
$ basename archive.tar.gz .gz
archive.tar
$ basename archive.tar.gz .tar.gz
archive
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"
filename="${path##*/}" # basename と同等
echo "$filename"
その他の拡張
Linux コマンド大全