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は、他のコマンドと組み合わせることでさらに多くのことができます。たとえば、findやxargsと組み合わせて、特定のディレクトリ内のファイル名を一括で取得するときにも役立ちます。
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
スクリプトでファイル名とディレクトリを両方使いたい場合は、basenameとdirnameを組み合わせるのが定番のパターンです。
よくある質問(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を使いこなして、日々の業務を効率化してみましょう。

コメント