basenameコマンドの使い方と具体例:Linux初心者向けガイド

コマンドリファレンス

Linuxのコマンドライン操作において、ファイルやディレクトリの操作は基礎中の基礎です。特に、ファイル名やパスを扱う際には、さまざまなコマンドを駆使しますが、中でもbasenameコマンドは非常に便利で、日常的によく用いられます。このガイドでは、Linux初心者の方に向けて、basenameコマンドの基本的な使い方と具体例を詳しく解説していきます。

basenameコマンドとは?

basenameコマンドは、指定したファイルパスからディレクトリ部分を取り除き、ファイル名だけを抽出するために使用されます。多くの場合、スクリプトの中でファイル名を取り扱うときや、ログを整理するシェルスクリプトを書く際に役立ちます。

基本構文

まずは、basenameコマンドの基本的な構文を見てみましょう。

basename [パス] [サフィックス]
  • [パス]:ここにパスを指定します。ファイルやディレクトリのフルパスでも、相対パスでも問題ありません。
  • [サフィックス]:省略可能な引数で、ここに指定した文字列をファイル名から取り除きます。

主なオプション一覧

基本の basename パス [サフィックス] 以外に、複数パスをまとめて処理したいときに使うオプションがあります。

オプション 意味・動作 使用例
-a--multiple 複数のパスを一度に処理する。指定すると各引数がすべてパスとして扱われる basename -a /a/x.txt /b/y.txt
-s SUFFIX--suffix=SUFFIX 指定したサフィックスを取り除く。-a と組み合わせて複数パスに一括適用できる basename -a -s .txt /a/x.txt /b/y.txt
-z--zero 出力の区切りを改行ではなくNUL文字にする。find -print0 と組み合わせるスクリプト向け basename -z -a file1 file2
--help ヘルプを表示 basename --help
--version バージョン情報を表示 basename --version

複数パスをまとめて処理する(-a / -s)

単一のサフィックス引数(第2引数)は1つのパスにしか使えませんが、-a-s を組み合わせると、複数パスから同じサフィックスをまとめて取り除けます。

$ basename -a -s .txt /home/user/report.txt /home/user/memo.txt

このコマンドの出力は:

report
memo

具体例で学ぶbasename

基本的な使い方

まずは、シンプルな使用例です。この例では、ディレクトリパスを指定して、ファイル名だけを取り出します。

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

このコマンドの出力は:

report.txt

このように、指定したパスの最後のスラッシュ以降の部分、つまりファイル名のみを抽出できます。

拡張子を取り除く例

続いて、拡張子を省略する例です。例えば、以下のように拡張子.txtを取り除きたい場合に使います。

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

このコマンドの出力は:

report

ここで、サフィックスとして指定した.txtが取り除かれていることが分かります。

ディレクトリのみの場合

もし、ディレクトリパスのみを指定したらどうなるのか、見てみましょう。

$ basename /home/user/documents/

この場合の出力は:

documents

指定されたパスの最後にスラッシュがある場合、それは無視され、ディレクトリ名が返されます。

実用的な例

basenameコマンドは、スクリプト作成において強力なツールです。日常のタスクでどのように使えるのか、具体的なシナリオで見ていきましょう。

バッチ処理のファイル名取得

ログファイルを日次で整理するスクリプトを考えてみます。basenameを使って、拡張子を取り除いたファイル名を取得し、それを加工に使用します。

#!/bin/bash

for file in /var/log/myapp/*.log; do
  filename=$(basename "$file" .log)
  tar -czf /backup/logs/"$filename"_$(date +%F).tar.gz "$file"
done

このスクリプトでは、/var/log/myapp/ディレクトリ内のすべての.logファイルをgzipで圧縮し、/backup/logs/に保存します。保存するファイル名には、元のログファイル名に今日の日付を追加します。

URLからファイル名を取得

basenameは、ファイルパス以外にもURLからファイル名を抽出する場合にも使えます。たとえば、ウェブからファイルをダウンロードするスクリプトを記述する際に便利です。

url="http://example.com/file/download.tar.gz"
filename=$(basename "$url")

この例では、filename変数にdownload.tar.gzが格納されます。

コマンドの組み合わせ

basenameは、他のコマンドと組み合わせることでさらに多くのことができます。たとえば、findxargsと組み合わせて、特定のディレクトリ内のファイル名を一括で取得するときにも役立ちます。

find /path/to/dir -type f | xargs -n 1 basename

このコマンドは、指定されたディレクトリ内のすべてのファイル名を抽出して表示します。

dirnameコマンドとの違い

basenameがパスから「ファイル名部分」だけを取り出すのに対し、dirnameは逆に「ディレクトリ部分」だけを取り出します。同じパスを両方に渡すと、パスを過不足なく分解できます。

$ path="/home/user/documents/report.txt"
$ basename "$path"
report.txt
$ dirname "$path"
/home/user/documents

スクリプトでファイル名とディレクトリを両方使いたい場合は、basenamedirnameを組み合わせるのが定番のパターンです。

よくある質問(FAQ)

Q1. basenameコマンドとは何ですか?

指定したパスからディレクトリ部分を取り除き、ファイル名(末尾の要素)だけを抽出するコマンドです。シェルスクリプトでファイルパスからファイル名だけを取得したいときによく使われます。

Q2. 拡張子だけを取り除くにはどうすればよいですか?

第2引数(サフィックス)に拡張子を指定します。basename report.txt .txt のように書くと report が返ります。複数ファイルをまとめて処理したい場合は -a -s .txt を使います。

Q3. basenameとdirnameの違いは何ですか?

basenameはパスの末尾(ファイル名)を、dirnameはパスの先頭側(ディレクトリ部分)を取り出します。詳しくは記事内の「dirnameコマンドとの違い」を参照してください。

Q4. 複数のファイルパスをまとめて処理できますか?

-a--multiple)オプションを使うと、複数のパスを一度に渡してまとめてファイル名を取得できます。同じ拡張子を一括で取り除きたい場合は -s SUFFIX と組み合わせます。

まとめ

basenameコマンドは、Linuxシステム上でのファイル名操作における必須ツールと言っても過言ではありません。ファイルパスから不要な部分を取り除き、シンプルにファイル名だけを扱えるため、スクリプト作成やシステム管理において非常に重宝します。単一パスの操作だけでなく、-a-s-zオプションを使えば複数パスの一括処理やNUL区切り出力にも対応できます。ディレクトリ部分を取り出したい場合はdirnameと組み合わせて使うと、パスの分解がよりスムーズになります。これからLinuxを学ぶ初心者の皆さんは、ぜひbasenameを使いこなして、日々の業務を効率化してみましょう。

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント