linux +验证文件是文本还是二进制文件

时间:2010-09-07 08:42:37

标签: linux

如何在不打开文件的情况下验证文件是二进制还是文本?

5 个答案:

答案 0 :(得分:9)

薛定谔的猫,我很害怕。

如果不打开文件,就无法确定文件的内容。文件系统不存储与内容相关的元数据。

如果不打开文件并不是一项艰难的要求,那么您可以使用多种解决方案。

修改

有许多评论和答案建议file(1)是确定内容的好方法。的确是。但是,file(1) 会打开该问题中禁止的文件。请参阅以下示例中的倒数第二行:

> echo 'This is not a pipe' > file.jpg && strace file file.jpg 2>&1 | grep file.jpg
execve("/usr/bin/file", ["file", "file.jpg"], [/* 56 vars */]) = 0
lstat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
stat64("file.jpg", {st_mode=S_IFREG|0644, st_size=19, ...}) = 0
open("file.jpg", O_RDONLY|O_LARGEFILE)  = 3
write(1, "file.jpg: ASCII text\n", 21file.jpg: ASCII text

答案 1 :(得分:7)

确定文件类型的正确方法是使用file(1)命令。

您还需要注意UTF-8编码的文件是“文本”文件,但可能包含非ASCII数据。其他编码也有这个问题。对于使用code page编码的文本,可能无法明确确定文件是否为文本。

file(1)命令将查看文件的结构以尝试确定它包含的内容 - 来自文件(1)手册页:

  

打印的类型通常包含   其中一个词是 text (文件   仅包含打印字符和   一些常见的控制字符是   可能安全地读取ASCII   终端), 可执行文件 (该文件包含   编译程序的结果   某些UNIX内核可以理解的形式   或其他),或 数据 意味着什么   else(数据通常是'二进制'或不可打印的)。

关于不同的字符编码,文件(1)手册页有这样说:

  

如果文件与任何文件都不匹配   魔术文件中的条目,它是        检查是否它似乎是一个文本文件。 ASCII,ISO-8859-x,非        ISO 8位扩展ASCII字符集(例如用于   苹果        和IBM PC系统),UTF-8编码的Unicode,UTF-16编码   Unicode,和        EBCDIC字符集可以通过不同的范围来区分   和        在每个集合中构成可打印文本的字节序列。   如果是文件        通过任何这些测试,报告其字符集。 ASCII,        ISO-8859-x,UTF-8和扩展ASCII文件被标识为   '文本'        因为它们几乎可以在任何终端上读取;   UTF-16和        EBCDIC只是'字符数据',因为它们包含文本   是        在可以阅读之前需要翻译的文本。

因此,某些文字将被识别为文字,但有些文字可能会被识别为字符数据。您需要确定自己是否对您的申请很重要并采取适当的措施。

答案 2 :(得分:2)

如果不查看文件,就无法确定。 Hoewever,你不必用编辑打开它,看看你自己有一个线索。您可能需要查看file命令:http://linux.die.net/man/1/file

答案 3 :(得分:2)

如果您尝试从命令shell执行此操作,则file命令将猜测它是什么文件类型。如果是文本,则通常在其描述中包含文字。

我不知道有任何100%的方法来确定这个,但文件命令可能是最准确的。

答案 4 :(得分:2)

在unix中,文件只是一些字节。因此,如果不打开文件,就无法确定100%是ASCII还是二进制。

您可以使用可用的工具并深入挖掘以使其变得简单。

  1. 文件
  2. cat -v