为什么“file”命令在.py文件上会混淆?
我写了几个Python模块。最近,我在这个目录下用file
命令查看了一下,结果让我很惊讶。它对文件的判断结果是这样的:
1 ASCII Java program text, with very long lines
1 a /bin/env python script text executable
1 a python script text executable
2 ASCII C++ program text
4 ASCII English text
18 ASCII Java program text
这真奇怪!你知道这是怎么回事吗?为什么它会把Python模块误认为是Java文件呢?
我使用的是CentOS 5.2。
补充说明 我其实只是好奇,为什么一些明显不是Java或C++的程序文件会被归类成那样。我当然不指望file
命令是完美的,但我对它的判断结果感到很意外。我本以为它会直接说是文本文件,而不是做出这么错误的推断。
3 个回答
2
我觉得答案是,第一个出现的(没有被注释掉的)单词是 import
。对于所有被判断为Java的文件来说,这个说法都是正确的,虽然有一些被分类为文本的文件也有这个单词。那些被判断为C++的文件是以 class
开头的。import
似乎是一个很强的线索,表明这个文件是Java文件,虽然不能完全确定。
6
我刚刚做了一个测试,发现每次识别错误的情况,文件里都没有shebang行。
对于每个包含了:
#!/usr/bin/env python
file
都能正确识别它。
从 magic
文件来看,另一个能让它被识别为Python文件的条件是第一行有三个引号。
$ echo '"""' | file -
/dev/stdin: python script text executable
$ echo '#!/usr/bin/python' | file -
/dev/stdin: python script text executable
$ echo '#!/usr/bin/env python' | file -
/dev/stdin: a python script text executable
4
来自 file手册页面
file命令会检查每个输入的文件,试图判断它的类型。它有三种测试方式,按这个顺序进行:文件系统测试、魔术数字测试和语言测试。只要有一个测试通过,就会显示这个文件的类型。
我猜你的某些文件可能同时符合不同语言的测试,导致文件类型被错误识别。
另外,file命令通常是用来处理二进制文件的,正如它的错误部分所提到的。
file使用了几种算法,优先考虑速度而不是准确性,因此它可能会对文本文件的内容产生误判。
对于文本文件(主要是编程语言的文件)的支持比较简单,效率也不高,而且更新时需要重新编译。