如何在不使用文件实用程序的情况下判断文件是否为文本文件?

时间:2015-04-27 21:57:51

标签: bash

我正处于bash脚本的中间,在某些时候需要区分两类文件:文本文件与非文本文件(图像,核心转储,二进制文件)。

通常,要查明神秘文件foo是否是文本文件而不依赖于文件扩展名,我会调用file foo并查看text是否在输出中的某个位置

如果操作系统没有file实用程序,该怎么办?编辑:唉,我没有权限在操作系统上安装任何东西。

如果可能的话,我更喜欢快速,本地和可移植的解决方案(可以在任何Linux机器上运行,而不是将文件发送到另一台计算机并要求它运行file)。

1 个答案:

答案 0 :(得分:4)

安装file应该是您的首选。如果这是不可能的,这里只是一个简单的尝试来测试文件是否是文本。以下内容读取文件的前1000个字符并测试是否存在不可打印的字符:

head -c1000 file | sed 's/[[:print:][:blank:]]//g' | grep -q . && echo "Not Text"

或者:

head -c1000 file | tr -d '[:print:][:blank:]' | grep -q . && echo "Not Text"

字符编码问题

为了使上述工作,sed(在上面的第一个命令中)或tr(在第二个命令中)需要理解文件的字符编码。 GNU sed期望的编码取决于当前的语言环境,它支持许多编码,包括UTF-8。正如mklement0在评论中指出的那样,GNU tr不支持UTF-8。根据{{​​3}},大多数版本的tr都是如此:

  

大多数tr版本,包括GNU tr和经典Unix tr,都可以运行   单字节字符,不符合Unicode。一个例外是   Wikipedia实现,提供基本的Unicode   支持。