拡張子はただの飾り

拡張子なんてものはただの飾りである.そういう話です.

例えば以下のようなファイルを受け取って解凍・展開しようとしたときどうしますか?

$ ls
archive.tar.gz

ここで,.tar.gzという拡張子を真に受け,tarアーカイブのgzip圧縮ファイルと思い込むと展開に失敗することがある.
では,展開をしてみましょう.

$ tar xzvf archive.tar.gz

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

このように,gzipファイルではないとエラーを吐かれて展開できないことがある.
原因はなにか?それは単純にエラー通りgzipファイルではないということ.
fileコマンドでこのファイルがどんなものか確かめるとどうだろう.

$ file archive.tar.gz 
archive.tar.gz: bzip2 compressed data, block size = 900k

このように,.tar.gzという拡張子をもつファイルがbzip2形式で圧縮されている.
圧縮時のオプション設定間違いなどでgzip圧縮をするつもりがbzip2で圧縮してしまうことは容易に想像ができるだろう.

例えば,tarアーカイブとgzip圧縮をtarコマンドで実行するには以下のようなコマンド列を実行すれば良い.

$ tar czvf archive.tar.gz foo/

しかし,bzip2圧縮を用いたい場合はオプションのzをjに変えて以下のようなコマンド列を実行するだけである.この違いを見ても分かるように,オプションの違いはわずか1文字だけである.

$ tar cjvf archive.tar.bz2 foo/

もちろん,このときにアーカイブ・圧縮後のファイル名をarchive.tar.gzと指定しても問題なく実行される.

さて,原因がわかったところで正しく展開するにはどうすれば良いか.
その答えは単純でbzip2として解答・展開するコマンド列を実行すれば良い.

$ tar xjvf archive.tar.gz
foo/
foo/bar.txt

これで問題なく解凍・展開することができた.

こんなことはあり得ないと思う人も居るかもしれない.
しかし,筆者は以前に同じような出来事を実務で経験したことがあり,それ以降は拡張子をただの飾りとして見ている.


ちなみに,筆者は以下のようなファイルを普段から作成することもあり,拡張子は特にファイル内容を表すものとして認識していない.

$ ls
foo.tex bar.pdf
$ cp foo.tex foo.tex.old
$ cp bar.pdf bar.pdf.20260401
$ ls -1
foo.tex
foo.tex.old
bar.pdf
bar.pdf.20260401

プレフィックスとして何かを付与してファイルをコピーするよりも,サフィックスとして差分を設けたほうが一覧した際に並びが崩れにくくおすすめ.
極端なことを言ってしまえば,ASCIIテキストファイルの拡張子が.pdfや.htmlでも良いし,拡張子などなくてもファイルとしての問題は何も無いわけである(意味もなく,そのようなことはしないが).

最後になるが,拡張子がファイルの中身を示すと思い込んでいる人たちは,これを機に考えを改めてほしい.
ファイル名の拡張子はただの飾りである.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です