如何从linux中的文本文件中分辨二进制文件

gab*_*bor 12 linux binary diff ascii

linux file命令在识别文件类型方面做得非常好,并且提供了非常细粒度的结果.该diff工具能够从文本文件中分辨二进制文件,从而产生不同的输出.

有没有办法告诉二进制文件形成文本文件?我想要的只是一个是/否答案给定的文件是否是二进制文件.因为很难定义二进制文件,所以我想知道是否diff会尝试基于文本的比较.

澄清问题:我不关心它是ASCII文本还是XML,只要它是文本.另外,我不想区分MP3和JPEG文件,因为它们都是二进制文件.

Tyl*_*nry 11

file仍然是你想要的命令.任何文本文件(根据其启发式)将在输出中包含"text"一词file; 任何二进制文件都不包含单词"text".

如果您不同意file用于确定文本与非文本的启发式方法,则需要更好地指定问题,因为文本与非文本是一个固有的模糊问题.例如,file不将ASCII中的PGP公钥块标识为"文本",但您可能(因为它仅由可打印字符组成,即使它不是人类可读的).

  • `file`的输出并不总是包含单词"text",例如XML文件的情况并非如此.但是`file -i`会给出mime类型,它确实包含单词"text" (3认同)

Ric*_*dle 6

一种快速而肮脏的方法是NUL在文件的前K个或两个中查找一个字符(零字节).只要您不担心UTF-16或UTF-32,任何文本文件都不应该包含NUL.

更新:根据diff手册,这正是diff所做的.


Dav*_*itt 6

DIFF手动指定

diff通过检查文件中的前几个字节来确定文件是文本还是二进制文件; 确切的字节数取决于系统,但通常为几千字节.如果文件该部分的每个字节都是非null,则diff将该文件视为文本; 否则它认为该文件是二进制文件.