如何在不打开文件的情况下验证文件是二进制还是文本?
答案 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还是二进制。
您可以使用可用的工具并深入挖掘以使其变得简单。