カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

ファイル形式にダマされていませんか?

すこーし前にtwitterでやりとりをしていて、自分だったらどう解決するだろうと思い、後学のためにも調べてみた。

結論から言えば、

「fileコマンドって便利だから、なんかあったら使おうぜ」

ということになる。

まず問題を起こしそうなファイルを作ってみる

manページにもあるけど、fileコマンドというのは「file - ファイルタイプを判定する 」コマンドである。要はこのファイルってなんのファイルなんだっていうときに使うものだったりする。

たとえば、こんな状況を作ってみる。

$ vi test.txt #適当に記述
$cat test.txt
aaa bbb ccc
ddd eee fff
ggg hhh iii
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc

$ tar -cvzf test.tar.gz test.txt
test.txt

tarのオプションを理解しないままcvzfでいいだろうとやってみて、単一ファイルをアーカイブ化し、しかも圧縮してくれちゃったりするケース。

一応オプションを説明すると、「c」がアーカイブの新規作成、「v」が詳細の表示、「z」がgzip形式に圧縮、「f filename」がファイル名の指定、となる。

ディレクトリ内のファイルでもなく、単一ファイルなので、圧縮まではいいんだけど、これを開く人が困ったりする。

実際gzipコマンドで展開させてみるとこんな感じ。

$ gzip -dc test.tar.gz
test.txt0000664000076400007640000000037411541576341012131 0ustar usergroupaaa bbb ccc
ddd eee fff
ggg hhh iii
aaa bbb ccc
aaa bbb ccc
aaa bbb ccc

一部書き換えたりしてますが、ファイル名のあとにパーミッションやらユーザ名やらグループやらが一行目に表示されたりする。

fileコマンドに活躍してもらう

まず一番最初のテキストファイルを調べてみる。

$ file test.txt
test.txt: ASCII text

うん、なんか妥当。

次に、上述したtarのオプションでgzip形式に圧縮したファイルを調べてみる。

$ file test.tar.gz
test.tar.gz: gzip compressed data, from Unix, last modified: Mon Mar 21 16:24:01 2011

これもそのまま。

次にこれを解凍させて調べてみる。

$ gzip -d test.tar.gz

$ file test.tar
test.tar: POSIX tar archive

もちろんこれも妥当だったりする。

fileコマンドがすごいのは次である。

$ mv test.tar test

$ file test
test.gz: POSIX tar archive

圧縮したときにファイル名をちゃんとつけなかったりでなんのファイルか分からなそうなときでもちゃんとファイル形式を表示してくれる。
だから、拡張子とかを変えたぐらいじゃ全然問題ない。

結論

ということで、あれなんかうまくgrepひっかからん。正規表現が効かないというときは元ファイル疑って、fileコマンドしてみるとよいと思ったりしたのでした。

おまけ

どうせだから、他のファイルだったらどんなメッセージ出るのか試してみた。

$ file index.html
index.html: XML 1.0 document text

$ file test.css
test.css:

$ file test.pdf
test.pdf: PDF document, version 1.6

$ file test.gif
test.gif: GIF image data, version 89a, 13 x 13

$ file test.js
test.js: ASCII text, with CRLF line terminators

$ file test.jpg
test.jpg: JPEG image data, JFIF standard 1.02

cssって判別できないのかなぁ… javascriptもテキストになっちゃってるから、そのあたりは贅沢言っちゃいけないのかもしれない。
それでも便利だと思うfileコマンドでした。