简介
在 Windows 或 macOS 中,你通常可以通过文件扩展名判断文件类型。文件名以 .jpg 结尾,通常就是图片;以 .exe 结尾,通常就是程序。
但在 Linux 中,文件名只是标签。就像现实生活中一样,标签可能是错的。你可以拿一个装盐的罐子,在标签上写「糖」,但里面的东西尝起来仍然是咸的。
Linux 不会盲目信任标签(文件名),而是检查文件内容,判断它实际是什么类型。
这体现了 Unix 的一个更广泛的理念:数据的含义通常取决于它的结构和使用方式,而不只是名称。文件扩展名可以为人类提供方便的提示,但不是最终依据。
在本实验中,你将使用 file 命令判断文件的真实类型,而不受文件名的影响。
这项技能在实际运维工作中很重要。你可能会遇到下载的文件、日志、转储文件、脚本,或名称具有误导性的可疑附件。在打开、执行或编辑这些文件之前,先确认它们的真实类型是明智的做法。
检查文本文件
先从一个名副其实的文件开始。
首先进入项目目录:
cd ~/project
ls -l
你会看到 welcome.txt。.txt 标签表明它可能是文本文件。但请记住,我们不盲目信任标签。
使用 file 命令检查该文件:
file welcome.txt
你会看到类似下面的输出:
welcome.txt: ASCII text
file 已经检查了文件内容,并确认:「是的,这是 ASCII 文本。」
在确认文件是文本文件后,cat、less 和文本编辑器等工具才能更适合使用。file 命令可以帮助你安全地做出判断。
这意味着你可以安全地读取该文件。使用 cat 命令:
cat welcome.txt
检查二进制文件
系统程序(例如 ls、mkdir 或 cat)不是文本文件,而是二进制文件。它们使用只有计算机处理器才能理解的语言编写。
下面检查 ls 命令本身。它位于 /bin 目录中。
使用 file 命令识别它:
file /bin/ls
输出可能看起来有些复杂,但其中包含了很多有用的信息:
/bin/ls: ELF 64-bit LSB pie executable, x86-64, ...
不用紧张。下面解释这段输出:
- ELF:标准的 Linux 程序格式(类似于 Windows 中的
.exe)。 - executable:表示这是一个可以运行的程序。
ELF 是 Executable and Linkable Format(可执行与可链接格式)的缩写,是许多 Linux 系统使用的标准二进制格式。你不必记住它的完整名称,但应该能够识别 ELF,并知道它表示「这是一个 Linux 可执行文件」。
关键结论是:file 告诉你这是一个可执行文件。如果你尝试执行 cat /bin/ls,屏幕上会充满奇怪的符号。知道文件是二进制文件后,你就会明白:「不要读取它,而应该运行它。」
识别未知文件
现在开始进行侦查。项目目录中有两个可疑文件:mystery_file 和 fake_image.jpg。
案例 1:没有扩展名的文件
mystery_file 没有扩展名。它是文本文件,还是程序?
检查它:
file mystery_file
结果:
mystery_file: PNG image data, ...
原来它是一个 PNG 图像。虽然它没有文件名标签,但 Linux 通过检查 PNG 图像的内部特征识别出了它的类型。
案例 2:说谎的文件
现在查看 fake_image.jpg。标签显示它是「JPEG 图像」,但事实真是这样吗?
file fake_image.jpg
结果:
fake_image.jpg: ASCII text
这是一个谎言!它实际上只是一个文本文件。
既然已经确认它是文本文件,就可以安全地读取它:
cat fake_image.jpg
这种根据内容而不是名称识别文件的技能,是区分 Linux 熟练用户和初学者的重要能力。
这也是 Linux 不像某些桌面操作系统那样依赖文件扩展名的原因之一。扩展名是一种有用的约定,但系统通常可以通过检查文件本身获得更多信息。
总结
你已经学会跳过文件标签,识别文件的真实类型。
- **
file filename**:用于揭示文件真实类型的命令。 - 扩展名可能会骗人:
.jpg不一定表示图像。 - 没有扩展名也没关系:Linux 不需要扩展名就能识别文件类型。
现在,你已经具备了处理实际环境中遇到的未知文件的能力!



