fileコマンドが間違ったMIMEタイプを返すようです。

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にできることはありますか?

答え1

mimetypeはUnixのマンページで「マジックナンバー」と呼ばれるものによって決まります。すべてのファイルには、ファイルの種類とファイルの種類を決定する魔法の数があります。以下は、fileコマンドのマニュアルページから抜粋したものです。

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のマニュアルページでは、ファイルがマジック番号と一致しない場合、テキストファイルはASCII / ISO-8859-x / non-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

提案

mimetypeファイルコマンドの代わりにコマンドを使用する

mimetype temp.csv

追加情報のためのWebリンク

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

答え2

残念ながら、ファイルに正しい出力を生成させるために実行できる操作がない可能性があります。

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

ファイルがバイナリでない場合は、エンコードを確認してファイル内の特定の単語を見つけてタイプを決定しますが、限られた数のファイルタイプ(ほとんどのプログラミング言語)にのみ適用されます。

関連情報