Non Mihi, Non Tibi, Sed Nobis
roadtoalinuxmintuser

theming

roundup
Linux Mint : ファイルの拡張子/形式/種類を特定「file」コマンド 00:48
ファイルの拡張子を見ることで、その拡張子からファイル形式を確認する人が大半だと思います。例えば、拡張子が jpg、gif、png、bmp であれば、そのファイルは画像ファイルだと推測することができ、zip であれば、アーカイバ―によって zip に圧縮されていることが分かります。

ところが、拡張子が全く間違っていたり、そもそも拡張子がついていない場合、どうやってファイル形式を特定したらいいでしょうか。

Linux にはファイル形式を特定するために file コマンドが用意されています。

file コマンドの挙動


ドキュメントによると file コマンドは1つのファイルに対して3つのテストを行います:
*ファイルシステムテスト
*マジックテスト
*言語テスト

ファイルシステムテストでは stat システムコールの戻り値を調べて、ファイルが空か否か、特別なファイルか否かを調べます。システムヘッダーファイル <sys/stat.h> でファイル形式を特定することができれば、そのファイル形式を返します。

マジックテストではファイルの中身の最初の数バイトを調べて、ファイル形式の特定に役に立ちそうなものを調べます。ファイルとファイル形式が一致するかどうか特定するのに使われるファイルが /etc/magic, /usr/share/misc/magic.mgc, /usr/share/misc/magic に置かれています。これらは $HOME/.magic.mgc、$HOME/.magic をホームディレクトリに置くことで書き換えることができます。

言語テストはテキストファイルかどうかを調べます。ファイルの数バイトを調べて ASCII, UTF-8, UTF-16, あるいはほかのフォーマットなのかを調べます。文字セットが分かったら、C言語なのか Python なのかなど色々な言語で調べます。

file コマンドの使い方


file コマンドは次のようにして使います:
file ファイル名
例えば miku というファイルのファイル形式を特定したい場合は
file miku
出力:
miku: PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced

画像ファイルであることが分かります。もっと正確に言えば、PNG 形式です。

ファイル形式によって、異なる結果を出力します:
*ISO ファイル - DOS/MBR boot sector ISO 9660 CD-Rom filesystem data 'label' (bootable); partition 2 : ID = 0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,4,63) startsector 1496, 4736 sectors
*ODS ファイル - OpenDocument Spreadsheet
*PDF ファイル - PDF Document, version 1.4
*CSV ファイル - ASCII text, with very long lines, with CRLF line indicators

出力結果の微調整


デフォルトでは file コマンドはファイル名とともに、詳細を表示しますが、ファイル名が要らない場合は -b を指定します:
file -b miku
出力:
PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced

デリミタ(区切り文字)を変更することもできます:
file -F '|' miku
出力:
miku| PNG image data, 1920 x 1080, 8-bit/color RGBA, non-interlaced


-i あるいは --mime を指定することで今風の MIME タイプの文字列にします:
file -i miku
出力:
miku: image/png; charset=binary

MIME タイプの例:
+----------+-----------------------------+
| ファイル形式 | MIMEタイプ |
+----------+-----------------------------+
| mp3 | audio/mpeg3 |
+----------+-----------------------------+
| CSV | text/comma-separated-values |
+----------+-----------------------------+
| PDF | application/pdf |
+----------+-----------------------------+
| JPEG | image/jpeg |
+----------+-----------------------------+
| .gzip | application/x-gzip |
+----------+-----------------------------+


MIME タイプ一覧 : Media Types

スクリプトも何の言語か特定できます:
file /usr/bin/mintinstall
出力:
/usr/bin/mintinstall: Python script, ASCII text executable


複数のファイルを同時処理


テキストエディターを使って、複数のファイル名を書き込んで、例えば「testfiles」という名前で保存します。testfiles に例えば、次のファイルを書き込みます:
/etc/passwd
/etc/pam.conf
/etc/opt

保存したら、次のコマンドを実行します:
file -f testfiles
出力:
/etc/passwd: ASCII text
/etc/pam.conf: ASCII text
/etc/opt: directory


圧縮ファイル


デフォルトでは、圧縮ファイルに対して file コマンドを使うと:
file.zip: ZIP archive data, at least V2.0 to extract
のようになり、書庫の中のファイルのファイル形式まで表示してくれません。
そこで、 -z を指定することで書庫の中のファイルのファイル形式まで表示することができます:
file -z file.zip
出力:
file.zip: Audio file with ID3 version 2.4.0, contains: MPEG ADTS, layer III, v1, 256 kbps, 44.1 kHz, Stereo (Zip archive data, at least v2.0 to extract)

Audio ファイルで MPEG layer III であることから mp3 が含まれていることがわかりました。

参考元 : about tech
| Linux |
<< NEW | TOP | OLD>>
スポンサーサイト 00:48
| - |

Show some apps list:


miku

Follow on your feed reader:


About this blog:

Linux Mint-centric chronicle.
Since 2009.
Info 更新日はストップしました。

roadtoapython

roadtorubyist

git