改行なしでファイルの「diff」

改行なしでファイルの「diff」

ASCIIではなく改行文字のないファイルを比較する必要があります。理想的には、何が追加されたのか、何が削除されたのか、何が修正されているのか、おそらく他のファイルとは異なる割合(パーセンテージ、サイズ)があるのか​​を確認したいと思います。

問題はdiff削除/追加された行についてのみ教えてくれるようですが、私の場合は誰が問題かを教えてくれるようです。 ASCII以外のファイルでは正常に動作しないようです。そのファイルをASCIIとしてマークしようとしているため、関連データは表示されません。

ベストアンサー1

diffテキストファイルにのみ適用されます。バイナリファイルに対してdiffを実行する前に、またはxxdを使用してファイルをテキストに変換する必要がありますhexdump。インスタントでやりやすいです。プロセスの交換

例えば

$ cat file1
A B C D E

$ cat file2
A B X D E

$ diff -u <(xxd file1) <(xxd file2)
--- /dev/fd/63  2022-03-06 15:40:23.811027810 +1100
+++ /dev/fd/62  2022-03-06 15:40:23.811027810 +1100
@@ -1 +1 @@
-00000000: 4120 4220 4320 4420 450a                 A B C D E.
+00000000: 4120 4220 5820 4420 450a                 A B X D E.

はい、file1とfile2はテキストファイルですが、テキストファイルは「テキスト」文字のみを含むバイナリファイルのサブセットです。この例では、テキストファイルを作成する方が簡単です。

注目すべき点は、バイナリファイルの小さな変更(たとえば、バイトの追加または削除)でも、diff大きな出力をもたらす可能性があることです。これは小さな変化の後、xxdまたは出力の各行がhexdump異なるためです。したがって、これはお勧めできません。あなたできるdiffの出力を/ dev / nullにリダイレクトして終了コードを確認しますが、ファイルが異なるかどうかを知りたい場合は、単に実行することをお勧めしますcmp

解決策:バイナリ用のパッチファイルを生成するためによく使用される以下のツールの1つであるバイナリdiffツールを使用してください。たとえば、

$ apropos diff | grep binary
radiff2 (1)          - unified binary diffing utility
bsdiff (1)           - generate a patch between two binary files
xdelta3 (1)          - VCDIFF (RFC 3284) binary diff tool

例えば

$ radiff2 file1 file2
0x00000004 43 => 58 0x00000004
$ 

xxdradiff2にはより読みやすいunidiff出力オプションもあります(しかし、出力が2つの大きなファイルの比較ダンプより小さいかどうかはわかりません)。

$ radiff2 -u file1 file2 
-0x00000004:43  "C D E\n"
+0x00000004:58  "X D E\n"

ファイルが同じ場合、radiff2は何も出力しません。

$ radiff2 file1 file1
$ 

おすすめ記事