はじめに
こんにちは!今回はbasenameコマンドについて解説します。
basenameはファイルパスからファイル名だけを抽出するコマンドです。フルパスが与えられたときに、最後のファイル名部分だけが欲しい時に超便利ですね。
スクリプトを書く時に頻繁に出てくるコマンドなので、これを機にマスターしちゃいましょう!
basenameコマンドとは
basenameは、フルパスやファイルパスからファイル名の部分だけを取り出す外部コマンドです。
例えば、/home/user/documents/file.txtというパスが与えられたとき、basenameはfile.txtだけを抽出します。シェルスクリプトの中で、ディレクトリパスに関係なくファイル名だけを処理したい時に重宝するコマンドです。
基本構文
|
|
パスはファイルのパス、サフィックス(省略可)は除外したい拡張子です。
主なオプション
| オプション | 説明 |
|---|---|
-a |
複数のパス引数をすべて処理(GNU拡張) |
-s |
サフィックスを指定(GNU拡張) |
-z |
出力をNUL文字で区切る(GNU拡張) |
使用例
例1: 基本的なパスからファイル名を抽出
|
|
実行結果:
|
|
フルパスからfile.txtというファイル名だけを取り出します。これが基本的な使い方です。
例2: 拡張子を除外する
|
|
実行結果:
|
|
第2引数に.txtを指定することで、拡張子を除外してfileだけを取り出します。
例3: シンプルなファイル名を処理
|
|
実行結果:
|
|
既にファイル名だけが与えられた場合は、そのまま返します。
例4: ディレクトリパスも処理
|
|
実行結果:
|
|
どんなディレクトリ階層からでも、ファイル名だけを取り出します。
例5: サフィックス指定で拡張子削除
|
|
実行結果:
|
|
特定の拡張子だけを削除することができます。
例6: スクリプト内での利用
|
|
実行結果:
|
|
スクリプト内で変数に結果を格納して使用できます。
例7: パイプでの利用
|
|
実行結果:
|
|
他のコマンドと組み合わせて使用できます。
例8: 複数ファイルの処理(GNU拡張)
|
|
実行結果:
|
|
GNU版のbasenameでは-aオプションで複数のファイルを一度に処理できます。
例9: サフィックス指定と組み合わせ(GNU拡張)
|
|
実行結果:
|
|
GNU拡張の-sオプションでサフィックスを指定します。
例10: 複雑なパスの処理
|
|
実行結果:
|
|
./や../を含むパスでも、最終的なファイル名を抽出します。
Tips・注意点
dirname コマンドとセット
basenameと反対に、ディレクトリパスだけを抽出したい時はdirnameコマンドを使います。
|
|
スクリプト内での定番パターン
ファイルを処理するスクリプトで、パス情報が必要ない場合はbasenameを使うパターンが定番です。
|
|
古いSystem V版とGNU版の違い
Linux環境ではGNU版が使われることが多く、-sや-aオプションが使えます。BSDやmacOSではオプションが異なることがあるので注意です。
実践的な使い方
ログファイルの処理
|
|
ログファイルのパスから拡張子を除いたファイル名を取り出して処理する例です。
ファイルコピー時のリネーム
|
|
ソースファイルのパスから名前だけを抽出して、別のディレクトリにコピーする時に便利です。
dirnameと組み合わせたパス処理
|
|
パスを分解して、ディレクトリとファイル名を別々に処理する例です。
まとめ
basenameコマンドのポイント:
- ファイルパスからファイル名だけを抽出する基本コマンド
- 第2引数で拡張子や特定の接尾辞を除外できる
- スクリプト内で
$(basename パス)として使用できる dirnameコマンドと組み合わせるとパス処理が強力- よく使う組み合わせ:
basename "$file" .txt、dirname "$file"
シェルスクリプトを書くなら、basenameとdirnameは必須の知識ですよ!