为什么“file”命令在.py文件上会混淆?

4 投票
3 回答
910 浏览
提问于 2025-04-16 12:32

我写了几个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使用了几种算法,优先考虑速度而不是准确性,因此它可能会对文本文件的内容产生误判。

对于文本文件(主要是编程语言的文件)的支持比较简单,效率也不高,而且更新时需要重新编译。

撰写回答