Linux 通过文件头中的代码确定文件的类型。此过程不依赖于文件扩展名来知道使用哪个软件打开文件。
(这是我所受的教育中所记得的。如果我错了,请纠正我!)
最近在使用 Ubuntu 系统:我发现系统上有很多文件带有诸如.sh
、.txt
、.o
、之类的扩展名.c
。
现在我想知道:这些扩展的目的是否仅仅是为了帮助人们了解他们正在查看的文件类型?还是它们对操作系统也有一定的用途?
答案1
这里没有100%黑色或白色的答案。
通常Linux 不依赖文件名(以及文件扩展名,即文件名中通常最后一个句点后面的部分),而是通过检查文件内容的前几个字节并将其与已知文件列表进行比较来确定文件类型。神奇数字。
例如,所有位图图像文件(通常以扩展名 开头)的前两个字节都.bmp
必须以字母开头。大多数脚本语言(如 Bash、Python、Perl、AWK 等)中的脚本(基本上所有以 开头的行都视为注释)可能包含一个 shebang作为第一行。这个特殊的注释告诉系统使用哪个应用程序打开文件。BM
#
#!/bin/bash
因此,操作系统通常依靠文件内容而不是其名称来确定文件类型,但说 Linux 上永远不需要文件扩展名只是事实的一半。
当然,应用程序可以按照自己的意愿实现文件检查,包括验证文件名和扩展名。一个例子是 Eye of Gnome(eog
,标准图片查看器),它通过文件扩展名确定图像格式,如果与内容不匹配,则会抛出错误。这到底是错误还是功能,可以讨论...
但是,即使操作系统的某些部分也依赖于文件扩展名,例如,在解析软件源文件时/etc/apt/sources.list.d/
- 仅*.list
解析具有扩展名的文件,而忽略所有其他文件。它可能主要不是用于确定文件类型,而是用于启用/禁用某些文件的解析,但它仍然是影响系统如何处理文件的文件扩展名。
当然,人类用户从文件扩展名中获益最多,因为这使得文件类型显而易见,并且还允许多个文件具有相同的基本名称和不同的扩展名,如、、site.html
等。缺点当然是文件扩展名和实际文件类型/内容不一定必须匹配。site.php
site.js
site.css
此外,它还需要跨平台互操作性,例如,Windows 不知道如何处理文件readme
,而只知道readme.txt
.
答案2
Linux 通过文件头中的代码确定文件类型。它不依赖于文件扩展名来知道使用什么软件来打开文件。
这是我所学的知识。如果我错了,请纠正我!
- 正确记住。
这些扩展仅适用于人类吗?
- 是的,但是。
当您与其他依赖扩展的操作系统进行交互时,使用扩展是更明智的想法。
在Windows中,打开软件附加在扩展中。
在 Windows 中打开名为“file”的文本文件比打开名为“file.txt”的相同文件更难(每次您都需要将文件打开对话框从切换*.txt
到*.*
)。对于 TAB 和分号分隔的文本文件也是如此。对于导入和导出电子邮件(.mbox 扩展名)也是如此。
特别是当你编写软件时。与“software.html”和“software.js”相比,打开名为“software1”的 HTML 文件和“software2”的 JavaScript 文件变得更加困难。
如果 Linux 中存在一个系统,文件扩展名很重要,我会称之为错误。当软件依赖于文件扩展名时,这是可以利用的。我们使用解释器指令来识别一个文件是什么(“文件中的前两个字节可以是字符“#!”,它们构成一个神奇的数字(十六进制的 23 和 21,“#”和“!”的 ASCII 值)通常称为 shebang,”)。
文件扩展名最著名的问题是给你的情书.TXT.vbs在 Windows 上。这是一个 Visual Basic 脚本,在文件资源管理器中显示为文本文件。
在 Ubuntu 中,当您从 Nautilus 启动文件时,您会收到警告,告知您要做什么。从 Nautilus 执行脚本时,它会启动一些软件,而这些软件应该打开 gEdit,这显然是个问题,我们会收到警告。
在命令行中执行某些操作时,您可以直观地看到扩展名是什么。如果它以 .vbs 结尾,我会开始怀疑(并不是说 .vbs 在 Linux 上是可执行的。至少需要付出更多努力 ;) )。
答案3
正如其他人所提到的,在 Linux 中使用了一种解释器指令方法(将一些元数据作为标题或幻数存储在文件中,以便可以告诉正确的解释器读取它),而不是 Windows 使用的文件扩展名关联方法。
这意味着您可以用几乎任何您喜欢的名称创建文件...除少数例外
然而
我想补充一点警告。
如果您的系统上的某些文件来自使用文件名关联的系统,则这些文件可能没有这些魔法数字或标题。文件扩展名用于由能够读取它们的应用程序识别这些文件,如果您重命名此类文件,您可能会遇到一些意想不到的影响。例如:
如果您将文件重命名My Novel.doc
为My-Novel
,Libreoffice 仍然可以打开它,但它将以“无标题”形式打开,您必须再次命名它才能保存它(Libreoffice 默认添加扩展名,因此您将有两个文件My-Novel
和My-Novel.odt
,这可能会很烦人)
更严重的是,如果你将文件 My Spreadsheet.xlsx 重命名为 My-Spreadsheet,然后尝试用它打开它,xdg-open My-Spreadsheet
你会得到这个(因为它实际上是一个压缩文件):
如果你将文件重命名My Spreadsheet.xls
为My-Spreadsheet
,当你xdg-open My-Spreadsheet
收到错误提示时
错误打开位置:没有注册任何应用程序来处理此文件
(尽管在这两种情况下,如果你这样做,它都可以正常工作soffice My-Spreadsheet
)
如果您将无扩展名的文件重命名为My-Spreadsheet.ods
withmv
并尝试打开它,您将得到以下信息:
(修复失败)
并且您必须重新放回原始扩展名才能正确打开文件(然后您可以根据需要转换格式)
总结:
如果您有带有名称扩展名的非本地文件,请不要删除扩展名,以为一切都会正常!
答案4
事实上,有些技术做依赖于文件扩展名,因此如果您在 Ubuntu 中使用这些技术,您也必须依赖扩展名。以下是一些示例:
gcc
使用扩展名来区分 C 和 C++ 文件。如果没有扩展名,几乎不可能区分它们(想象一下没有类的 C++ 文件)。- 许多文件(
docx
、jar
、apk
)只是特定结构化的 ZIP 存档。虽然您通常可以从内容推断出类型,但并不总是可行的(例如 Java Manifest 是选修的在jar
文件中)。
在这种情况下不使用文件扩展名只能通过黑客变通方法来实现,而且很容易出错。