どんなと区別する'バイナリ"と"テキスト'ファイル?
-
05-09-2019 - |
質問
非公式にものもございますので、あらかじめ、"バイナリー'ファイルオブジェクトファイル、画像、動画、実行可能ファイルを、独自開発の文書形式など)は、'text'ファイル(ソースコードは、XMLファイル、HTMLファイルをメールします。
一般に把握しておく必要があり、ファイルの内容ができるような使用頻度の高いものを取り揃えで、書におけるガバナンスの場合、エンコーディング'のバイナリの"や"テキスト"するものではありませんね。もちろんファイルの店でバイトのデータなどすべての'のバイナリ"と"テキスト"というものを知らずにエンコーディングです。それなのに、まだに有話をバイナリ"と"テキスト'ファイルがな違反した人はこの不正確に定義するものです。用怖'ます。
しかし、各種ツールすることができる広範囲のファイルにしたいかないものがあるかどうかを基準にファイルは'テキスト"または"バイナリの'.例えば、他ツールのデータを出力します。Plain'text'みにランキングが便利です。'バイナリデータヘヴンリースキーリゾートアップターミナル、一般的になります。GNU grep少なくともこの区別を決定する際のになるような場合は出力にマッチしたソフトである。
その質問は、どのようにしないといけないと考えている場合、ファイルは'テキスト"または"バイナリー'?及び制限がさらにどのようにしないといけないと考えているLinuxのようなファイルシステム?私はよく知らないの他ファイルシステムメタデータを示す'タイプ'ファイルの質問を更になり、検査のコンテンツのファイルをどのように私の場合は'テキスト"または"バイナリー'?は、簡単のために作を制限する'text'の意味と文字を印刷可能なユーザーのソフトである。特についてはどのように捉えてい の実施 す。(これってすごいことだなと思いなかで示唆された当サイトのことができるようになると一般に関する既存コードのことがあったものの、指定された)を思いるという、既存のプログラムを使うのではないかと思います。
他のヒント
あなたはfile
コマンドを使用することができます。それがバイナリかテキストかどうかを決定するために、ファイル(man file
)でテストの束を行います。あなたはCからそれを行うために必要がある場合は、そのソースコードを借りる/で見ることができます。
file README
README: ASCII English text, with very long lines
file /bin/bash
/bin/bash: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped
は、
でファイルの MIMEタイプを決定することができますfile --mime FILENAME
速記は(コメントを参照)MacOSの上でLinux上file -i
とfile -I
(資本I)である。
それはtext/
で始まる場合、それは、そうでない場合は、バイナリテキストです。唯一の例外は、XMLアプリケーションです。あなたは、ファイルタイプの末尾に+xml
を探すことによって、ものと一致することができます。
さて、あなただけのすべての文字がisprint(c)
で印刷可能であるかどうかを確認、ファイル全体を検査している場合。それは、Unicodeのために少し複雑になります。
Unicodeテキストファイルを区別するために、 MSDNには、いくつかを提供していますに何をすべきかについての素晴らしいアドバイスます。
それの要旨は、第一最初の4つのバイトまで検査することである。
EF BB BF UTF-8
FF FE UTF-16, little endian
FE FF UTF-16, big endian
FF FE 00 00 UTF-32, little endian
00 00 FE FF UTF-32, big-endian
これはあなたのエンコーディングを教えてくれます。その後、テキストファイル内の文字の残りのiswprint(c)
を使用したいと思います。 UTF-8とUTF-16の場合、あなたは、単一の文字がバイトの可変数で表すことができるので、手動でデータを解析する必要があります。あなたは本当に肛門のならそれはあなたのプラットフォーム上で利用できる場合も、あなたはiswprint
のロケールバリアントを使用するとよいでしょう。
Perlがまともなヒューリスティックを持っています。 (テキストをテストし、その反対側、-B
)バイナリをテストする-T
演算子を使用。ここでのテキストファイルを一覧表示するワンライナーをシェルます:
$ find . -type f -print0 | perl -0nE 'say if -f and -s _ and -T _'
(先行ドルないもの下線)は(RTFM正しいことに注意してください。)
ほとんどのプログラム、または(すなわち、それらはすべて印刷可能なASCII charctersの範囲内に入らない)ではありません。細かいdistictionのためにUNIXライクなシステム上の「file」コマンドが常にあります。
その昔の話題、多分誰かがこれは役に立つでしょう。
:何かがファイルである場合は、スクリプトで決めなければならないなら、あなたは、単に次のように行うことができますif file -i $1 | grep -q text;
then
.
.
fi
このファイルの種類を取得し、サイレントのgrepで、あなたがそのテキストかどうかを決定することができます。
現在のディレクトリ/サブディレクトリ内のテキストファイル名をリストするには:
$ grep -rIl ''
バイナリます:
$ grep -rIL ''
特定のファイルを確認するには、少しのコマンドを変更します:
$ grep -qI '' FILE
、その後、終了ステータス「0」ファイルがテキストであることを意味します。 '1' - バイナリ。 チェックすることができます:
$エコー$?
\0
の文字が含まれている場合は、一つの簡単なチェックがあります。テキストファイルは、それらを持っていません。
前述の* nixのオペレーティングシステムとしては、fileコマンド内でこの能力を持っています。このコマンドは、多くの一般的なファイル構造内に含まれるマジックナンバーを定義する構成ファイルを使用します。
これは、いくつかのディストリビューションでは、/ usr / shareであってもよいが、魔法と呼ばれるこのファイルは、歴史的には、/ etcに格納されていました。マジックファイルは、ファイル内に存在することが知られている値のオフセットを定義し、ファイルの種類を決定するためにこれらの場所を調べることができます。
マジックファイルの構造の説明は、関連するマニュアルページ(マン・マジック)
を調べることによって見つけることができますfile.cと<内に見出すことができる実装、ウェルについて/>自体、それが読み取り可能なテキストがあるか否かを判定するfileコマンドのしかし関連部分は以下の通りです。
/* Make sure we are dealing with ascii text before looking for tokens */
for (i = 0; i < nbytes - 1; i++) {
if (!isascii(buf[i]) ||
(iscntrl(buf[i]) && !isspace(buf[i]) &&
buf[i] != '\b' && buf[i] != '\032' && buf[i] != '\033'
)
)
return 0; /* not all ASCII */
}