如何在不打开文件的情况下验证文件是二进制还是文本?
恐怕这就是薛定谔的猫。
在不打开文件的情况下无法确定文件内容,文件系统不存储与内容相关的元数据。
如果不打开文件不是硬性要求,那么有许多可用的解决方案。
编辑:
在一些评论和答案中提到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
确定文件类型的正确方法是使用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”。您需要自行确定这是否对您的应用程序有影响并采取适当的措施。如果不查看文件内部,就无法确定其内容。但是,你不必打开编辑器并亲自查看才能有线索。你可以使用file
命令来查看:http://linux.die.net/man/1/file
如果您正在尝试从命令行执行此操作,则file
命令将猜测文件类型。如果是文本,则通常在其描述中包含单词“text”。
我不知道有任何100%确定的方法,但是file
命令可能是最准确的。
0x65
的一字节文件。现在告诉我这是二进制还是文本。 - MSalters