我正处于bash脚本的中间,在某些时候需要区分两类文件:文本文件与非文本文件(图像,核心转储,二进制文件)。
通常,要查明神秘文件foo
是否是文本文件而不依赖于文件扩展名,我会调用file foo
并查看text
是否在输出中的某个位置
如果操作系统没有file
实用程序,该怎么办?编辑:唉,我没有权限在操作系统上安装任何东西。
如果可能的话,我更喜欢快速,本地和可移植的解决方案(可以在任何Linux机器上运行,而不是将文件发送到另一台计算机并要求它运行file
)。
答案 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 支持。