basename コマンド

パス名からファイル名またはディレクトリ名を抽出します。

概要

basenameはパスからディレクトリ部分と接尾辞を取り除き、ファイル名または最終ディレクトリ名だけを返します。シェルスクリプトでフルパスからファイル名を抽出したり、ファイル拡張子を削除したりする際によく使用されます。

オプション

basename NAME [SUFFIX]

NAMEからディレクトリ部分と、オプションのSUFFIXを削除します。

$ basename /usr/bin/sort
sort

basename OPTION... NAME...

指定されたオプションに従って複数の名前を処理します。

-a, --multiple

複数の引数をサポートし、それぞれをNAMEとして扱います。

$ basename -a /usr/bin/sort /usr/bin/cut
sort
cut

-s, --suffix=SUFFIX

各NAMEから末尾のSUFFIXを削除します。

$ basename -s .txt file.txt
file

-z, --zero

各出力行を改行ではなくNUL文字で終了します。

$ basename -z /usr/bin/sort | hexdump -C
00000000  73 6f 72 74 00                                    |sort.|
00000005

使用例

ディレクトリ部分の削除

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

ファイル拡張子の削除

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

同じ接尾辞を持つ複数のファイルの処理

$ basename -a -s .txt file1.txt file2.txt file3.txt
file1
file2
file3

シェルスクリプトでの使用

$ filename=$(basename "$fullpath")
$ echo "The filename is: $filename"
The filename is: document.pdf

ヒント:

dirnameとの併用によるパス操作

basenamedirnameと組み合わせると、パスをコンポーネントに分割する際に便利です:

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

スペースを含むパスの処理

パスにスペースが含まれる可能性がある場合は、常に引数を引用符で囲みます:

$ basename "/path/with spaces/file.txt"
file.txt

複数の拡張子の削除

複数の拡張子(.tar.gzなど)を削除するには、複数のコマンドやsedなどの他のツールを使用する必要があります:

$ basename "archive.tar.gz" .gz | basename -s .tar
archive

よくある質問

Q1. basenameとbashのパラメータ展開を使用する違いは何ですか?

A. bashでの${filename##*/}は同様の機能を実行しますが、basenameは異なるシェルでも動作し、接尾辞の削除などの追加オプションを提供します。

Q2. basenameは一度に複数のファイルを処理できますか?

A. はい、-aまたは--multipleオプションを使用すると、1つのコマンドで複数のファイル名を処理できます。

Q3. .tar.gzのような複数の拡張子を削除するにはどうすればよいですか?

A. basenameは一度に1つの接尾辞しか削除できません。複数の拡張子の場合は、basenameを複数回実行するか、他のテキスト処理ツールを使用する必要があります。

Q4. basenameは元のファイルを変更しますか?

A. いいえ、basenameは変更された名前を標準出力に出力するだけです。ディスク上のファイルは変更しません。

参考文献

https://www.gnu.org/software/coreutils/manual/html_node/basename-invocation.html

改訂履歴