ここに何かが欠けているかもしれませんが、今日少し違う2つのdiff
ファイルを.html
実行しようとすると、次のメッセージが表示されて驚きました。
$ diff index.html index3.html
Binary files index.html and index3.html differ
ファイルがバイナリと見なされるのはなぜ.html
ですか?これを避けてテキストファイルとして処理する方法はありますか?
答え1
GNUの違いファイルをバイナリとして扱う最初の数キロバイト内にnullバイトがある場合。テキストファイルにはnullバイトは含まれていませんが、バイナリファイルには最初の数百バイト内にnullバイトが含まれる可能性が高いため、これは良い経験的な方法です。ファイル名は重要ではありません。
diff がバイナリ間の違いを表示しないのは、一般的に読み取れないからです。バイナリ形式は、ブロックが変更された後に便利な並べ替えを提供する行に分割できないことがよくあります。多くの場合、基本的に小さい意味の変化に変わります(たとえば、圧縮ファイルに1文字を挿入すると、それに続くすべての内容が変更される可能性があります)。印刷できません。ただし、diff は null バイトを使用できます。 diffがファイルをテキストとして処理するようにするには(つまり、違いを表示する)--text
(または-a
)オプションを渡します。
diff --text index.html index3.html
これが役に立つかどうかは、ファイルにヌルバイトが含まれている理由によって異なります。ヌルバイトはHTMLファイルでは一般的ではありません。ヒントが得られます。
file index.html
ファイルが実際に圧縮されている場合、diffは役に立つ内容を表示しません。ファイルを解凍し、圧縮メカニズムを反映する名前を指定する必要があります(たとえば、index.html.gz
.圧縮ファイルがある場合は、bash / ksh / zshからすぐに解凍できます(uncompress
標準入力から圧縮ファイルを読み取って解凍テキストを標準出力に書き込む実際のコマンドに置き換えられます)。
diff --label=index.html <(uncompress <index.html) --label=index3.html <(uncompress <index3.html)
ファイルがASCIIではなくエンコードされている可能性があります。例えばUTF-16、UCS-2、UTF-32または、事前のUnicodeマルチバイトエンコーディングです。このエンコーディングはウェブではほとんど使用されません。 Webブラウザはこれをサポートしますが、ドキュメント作成ツールに問題がある可能性があります。この場合、生産チェーンを修正して使用するとUTF-8代わりに。同時に、diff --text
存在する非ASCIIコンテンツに応じて読み取ることも読み取れないかもしれない結果を提供するか、即座にファイルを変換してdiffに渡すことができます(例えば、リトルエンディアンUTFでエンコードされたファイルを使用)。 -16:
diff --label=index.html <(iconv -f UTF-16LE -t UTF-8 <index.html) --label=index3.html <(iconv -f UTF-16LE -t UTF-8 <index3.html)