Linux + 验证文件是否为文本或二进制

7

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


很难确定这个问题是否与编程有关,或者是否应该迁移到SuperUser.com(是否需要一个现有的实用程序?)。 - johnsyweb
文本最多只是二进制的一个子集,如果不是解释的话。考虑一个包含 0x65 的一字节文件。现在告诉我这是二进制还是文本。 - MSalters
在验证之前复制文件怎么样?复制 -> 打开 -> 验证 -> 删除 - Luka Rahne
@ralu:你打算如何在不打开文件的情况下复制它? - johnsyweb
@MSalters,等你看到我的ASCII编码的位图图像格式就知道了。 - Seamus Connor
@MSalters 在许多情况下,您可以绝对确定“二进制”是否属于“文本子集”。 - xdhmoore
5个回答

10

恐怕这就是薛定谔的猫。

在不打开文件的情况下无法确定文件内容,文件系统不存储与内容相关的元数据。

如果不打开文件不是硬性要求,那么有许多可用的解决方案。

编辑:

在一些评论和答案中提到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
Unix命令文件在启发式地确定类型方面做得很好。 - Joel
@Joel:是的,它会打开文件。 - johnsyweb
1
这个问题太模糊了,无法确定“open”是否指的是open(2)。 “Open”还有其他含义。 - camh
足够正确,@camh。我认为“打开”意味着“检查”文件的内容。也许@lidia有兴趣知道用户没有读取权限的文件是文本还是二进制文件。“file”等在这里无法使用。 - johnsyweb

7

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

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

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

打印的类型通常包含以下单词之一:text(文件只包含打印字符和一些常见控制字符,可能安全地在ASCII终端上阅读),executable(文件包含编译程序的结果,以某些UNIX内核或其他内核可理解的形式表示),或data表示其他任何内容(数据通常是“二进制”或不可打印的)。

关于不同字符编码,file(1)手册页有如下说明:

如果一个文件在magic文件中没有匹配任何条目,则会检查它是否似乎是文本文件。 ASCII,ISO-8859-x,非ISO 8位扩展ASCII字符集(例如Macintosh和IBM PC系统上使用的字符集),UTF-8编码的Unicode,UTF-16编码的Unicode和EBCDIC字符集可以通过构成每个集合中可打印文本的不同字节范围和序列来区分。如果文件通过这些测试中的任何一个,其字符集将被报告。 ASCII,ISO-8859-x,UTF-8和扩展ASCII文件被标识为“text”,因为它们几乎可以在任何终端上读取; UTF-16和EBCDIC仅为“character data”,因为虽然它们包含文本,但需要翻译才能阅读。因此,一些文本将被标识为“text”,但有些可能会被标识为“character data”。您需要自行确定这是否对您的应用程序有影响并采取适当的措施。

2

如果不查看文件内部,就无法确定其内容。但是,你不必打开编辑器并亲自查看才能有线索。你可以使用file命令来查看:http://linux.die.net/man/1/file


2

如果您正在尝试从命令行执行此操作,则file命令将猜测文件类型。如果是文本,则通常在其描述中包含单词“text”。

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


1
确实如此,尽管我不确定他是反对自己打开文件还是让工具打开它。我已经说明了没有100%确定的方法来做到这一点。 - Steve Weet

2
在Unix中,文件只是一些字节。因此,在打开文件之前,您无法百分之百确定它是ASCII还是二进制格式。
您可以使用可用的工具并深入挖掘以使其防误操作。
1. file 2. cat -v

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接