basenameのSUFFIX指定で拡張子を除いてファイル名を取得する方法を解説!初心者向けLinuxコマンド講座
生徒
「Linuxでファイルの名前だけを取り出したいんですけど、拡張子はいらないんです。どうすればいいですか?」
先生
「その場合は、basenameコマンドのSUFFIX指定を使うと便利ですよ。」
生徒
「SUFFIXってなんですか?難しそう…」
先生
「心配しないで。とてもシンプルだから、わかりやすく説明しますね!」
1. basenameコマンドとは?
basenameコマンドは、フルパス(ディレクトリ名を含むファイルの位置情報)から、末尾のファイル名だけを抽出するためのLinux標準コマンドです。
例えば、/home/user/documents/report.txt という長い住所のようなパスがあったとき、私たちが本当に知りたいのは report.txt という名前だけであることが多いですよね。この「名前だけ」をサッと取り出してくれるのが basename の役割です。
「東京都千代田区1-1-1 〇〇ビル」という住所から、「〇〇ビル」という建物名だけを抜き出す作業に似ています。
プログラミング未経験の方でも、まずは以下の簡単な実行例を見てみましょう。ターミナル(コマンド入力画面)でこのように入力します。
basename /var/www/html/index.html
index.html
実行結果を見ると、ディレクトリ部分(/var/www/html/)が切り捨てられ、ファイル名である index.html だけが表示されました。このように複雑な階層構造を無視して、対象のファイルが「何という名前か」を特定したいときに非常に重宝します。
主な利用シーンとしては、大量のファイルを処理するシェルスクリプトの中で、特定のファイル名に基づいてログを出力したり、保存先の名前に反映させたりする場合によく活用されます。
2. basenameの基本的な使い方
まずは、オプションや追加の指定を何も行わない、最も標準的なbasenameコマンドの動作を確認してみましょう。このコマンドの役割は、ディレクトリの階層構造(パス)を切り離して、純粋な「ファイル名」だけを表示させることです。
例えば、あなたがパソコンの中で「画像フォルダ」の中にある「image.jpg」というファイルを見ていると想像してください。システム上のフルパスで指定しても、basenameを使えばファイル名だけを取り出すことができます。
basename /home/user/photos/image.jpg
image.jpg
上記の実行結果を見ると、ファイルが保存されている場所(/home/user/photos/)がすべて取り除かれ、末尾にある image.jpg だけが表示されました。これは、ファイルがどこにあるかではなく、そのファイル自体が「何という名前か」を確認したいときに非常に便利です。
通常の使い方の場合は、実行結果に
.jpg や .txt といった拡張子が含まれたままになります。もし、この拡張子さえも消して「名前だけ」にしたい場合に使うのが、次に解説する「SUFFIX(接尾辞)」の指定です。
プログラミングやサーバーの管理では、このようにパスからファイル名だけを抽出する操作が頻繁に行われます。まずはこの「一番後ろの名前だけを拾ってくる」という感覚を掴んでおきましょう。
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