web-dev-qa-db-ja.com

fileコマンドが明らかに間違ったMIMEタイプを返す

次のようにtext/csvが返されないのはなぜですか?

$ echo 'foo,bar\nbaz,quux' > temp.csv;file -b --mime temp.csv
text/plain; charset=us-ascii

わかりやすくするためにこの例を使用しましたが、他のCSVファイルでも問題が発生しています。

$ file -b --mime '/Users/jasonswett/projects/client_work/Gd/spec/test_files/wtf.csv'
text/plain; charset=us-ascii

CSVがCSVだと思わないのはなぜですか? fileに「正しい」ものを返させるためにCSVにできることはありますか?

6
Jason Swett

残念ながら、ファイルに正しい出力を生成させるためにできることはおそらくありません。

fileコマンドは、マジックナンバーのデータベースに対してファイルの最初の数バイトをテストします。これは、ファイルの先頭に特定の識別子があるバイナリファイル(イメージや実行可能ファイルなど)で簡単に確認できます。

ファイルがバイナリファイルでない場合は、エンコーディングをチェックし、ファイル内の特定の単語を探してタイプを判別しますが、限られた数のファイルタイプ(ほとんどはプログラミング言語)のみを検索します。

5
Trenton

Mimetypeは、UNIXのマンページで「マジックナンバー」と呼ばれるものによって決定されます。すべてのファイルには、ファイルタイプとファイル形式を決定するマジックナンバーがあります。以下の抜粋は、ファイルコマンドのマニュアルページからの抜粋です。

The magic number tests are used to check for files with data in partic-
       ular fixed formats.  The canonical example of this  is  a  binary  exe-
       cutable  (compiled  program)  a.out  file,  whose  format is defined in
       a.out.h and possibly exec.h in the standard include  directory.   These
       files  have  a  'magic  number'  stored  in a particular place near the
       beginning of the file that tells the UNIX  operating  system  that  the
       file  is  a binary executable, and which of several types thereof.  The
       concept of 'magic number' has been applied by extension to data  files.
       Any  file  with  some invariant identifier at a small fixed offset into
       the file can usually be described in this way.  The information identi-
       fying   these   files   is   read   from   the   compiled   magic  file
       /usr/share/file/magic.mgc , or  /usr/share/file/magic  if  the  compile
       file  does  not exist. In addition file will look in $HOME/.magic.mgc ,
       or $HOME/.magic for magic entries.

Unixのmanページでは、ファイルがマジックナンバーと一致しない場合、テキストファイルはASCII/ISO-8859-x /非ISO 8ビット拡張ASCII(最適な形式)と見なされるとも述べられています。

 If a file does not match any of the entries in the magic    file,  it  is
       examined to see if it seems to be a text file.  ASCII, ISO-8859-x, non-
       ISO 8-bit extended-ASCII character sets (such as those used  on  Macin-
       tosh  and  IBM  PC systems), UTF-8-encoded Unicode, UTF-16-encoded Uni-
       code, and EBCDIC character sets can be distinguished by  the  different
       ranges  and  sequences  of bytes that constitute printable text in each
       set.  If a file passes  any  of  these  tests,  its  character  set  is
       reported.  ASCII, ISO-8859-x, UTF-8, and extended-ASCII files are iden-
       tified as ''text'' because they will be mostly readable on  nearly  any
       terminal

提案

fileコマンドの代わりにmimetypeコマンドを使用します

mimetype temp.csv

さらに掘り下げるためのウェブリンク

http://unixhelp.ed.ac.uk/CGI/man-cgi?file
6
repzero