basenameのSUFFIX指定で拡張子を除いてファイル名を取得する方法を解説!初心者向けLinuxコマンド講座
生徒
「Linuxでファイルの名前だけを取り出したいんですけど、拡張子はいらないんです。どうすればいいですか?」
先生
「その場合は、basenameコマンドのSUFFIX指定を使うと便利ですよ。」
生徒
「SUFFIXってなんですか?難しそう…」
先生
「心配しないで。とてもシンプルだから、わかりやすく説明しますね!」
1. basenameコマンドとは?
basenameコマンドは、ファイルパス(例:/home/user/file.txt)の中からファイル名の部分だけを取り出すためのLinuxコマンドです。
このコマンドは、フォルダの中にあるファイルの「名前」だけを知りたいときに使われます。たとえば、シェルスクリプトの中でファイル名だけを表示したいときなどに便利です。
2. basenameの基本的な使い方
まずは、拡張子を除外しない通常のbasenameコマンドの使い方を見てみましょう。
basename /home/user/photos/image.jpg
image.jpg
このように、ファイル名だけが取り出されます。しかし、.jpgの部分(拡張子)は残ったままです。
3. SUFFIXを指定して拡張子を除外する方法
basenameコマンドでは、第2引数に除外したい文字列(SUFFIX)を指定できます。これにより、ファイル名から拡張子を取り除いた形で取得できます。
次のように使います:
basename /home/user/photos/image.jpg .jpg
image
このように.jpgが除かれて、ファイル名だけが表示されました。これがSUFFIX指定の威力です!
4. 複数の拡張子がある場合は?
たとえば、次のようなファイルがあるとします:
basename /home/user/data/archive.tar.gz .gz
archive.tar
ここでは.gzだけが除かれました。もし.tar.gzの両方を取り除きたい場合は、完全な拡張子をSUFFIXに指定しましょう。
basename /home/user/data/archive.tar.gz .tar.gz
archive
このようにすると、すべて除外されてシンプルな名前だけが取り出せます。
5. 拡張子以外の文字列も除外できる?
実は、basenameのSUFFIX指定は拡張子に限りません。ファイル名の末尾に一致する文字列であれば、どんなものでも除外できます。
basename /home/user/report_final_draft report_final_
draft
このように、report_final_という文字列が削除されて、draftだけが残ります。
6. 応用:シェルスクリプトで使う場合
SUFFIXを指定したbasenameは、シェルスクリプトでのログ出力や処理対象の名前取得などにも便利です。
以下はファイル名から拡張子を取り除いて変数に代入する例です:
FILENAME=$(basename /path/to/movie.mp4 .mp4)
echo $FILENAME
movie
このようにすれば、拡張子のないシンプルな名前を変数に格納して使うことができます。
7. 他の類似コマンドとの違い
basenameはファイル名を抽出するためのコマンドですが、似た用途を持つLinuxコマンドにdirnameがあります。
basename:ファイル名だけを取り出すdirname:ファイルのパス(ディレクトリ)だけを取り出す
例を見てみましょう:
dirname /home/user/image.png
/home/user
basename /home/user/image.png .png
image
このように、使い分けることで柔軟なファイルパスの処理が可能になります。
8. ファイル名がピリオドを含む場合の注意点
例えばmy.backup.tar.gzのように、ファイル名にピリオドが複数含まれている場合、正確に除外したいSUFFIXを指定しないと意図しない結果になることがあります。
次の例を見てください:
basename my.backup.tar.gz .gz
my.backup.tar
このように、.gzだけが除外されます。もし.tar.gz全体を削除したいなら、明示的に指定しましょう。
basename my.backup.tar.gz .tar.gz
my.backup