为什么以点开头的文件名被隐藏?我可以隐藏文件而不使用点作为第一个字符吗?

为什么以点开头的文件名被隐藏?我可以隐藏文件而不使用点作为第一个字符吗?

起初我以为这是巧合,但现在我发现这甚至是巧合一个标签对于它:所有隐藏文件名都以点开头。这是一个约定吗?为什么选择它?可以改变吗?或者换句话说(正如 @evilsoup 所建议的一个相关问题,这暗示了许多其他问题的答案):我可以隐藏文件而不重命名它们(用作.其名称的第一个字符)吗?

答案1

根据维基百科,

文件名前面带有 .应该隐藏的是 Unix 早期的一个软件错误的结果。当特殊条目...目录条目添加到文件系统时,决定 ls 命令不应显示它们。但是,该程序被错误地编写为排除任何名称以字符开头的文件.,而不是确切的名称....

...所以它一开始是一个错误,然后它被接受为一个功能(为了记录,.是一个到当前目录的链接,也是..一个到它上面的目录的链接,但我相信你已经知道了)。由于这种隐藏文件的方法实际上在大多数情况下都足够好,所以我想没有人费心去实现 Windows 风格的文件隐藏。

还有一个事实是,实施不同的行为会给 *nix 世界带来更多的碎片,这是任何人都不想看到的。

还有另一种隐藏文件的方法涉及重命名它们,但它只适用于 GUI 文件管理器(而且它在这些文件管理器中并不通用——主要的 Linux 都使用它,但我不认为 OSX 的 Finder 会这样做,而且更小众的 Linux 文件管理器不太可能支持这种行为):您可以创建一个名为 的文件.hidden,并将要隐藏的文件名放入其中,每行一个。lsshell glob 不会尊重这一点,但它仍然可能对你有用。

答案2

以点开头的文件是被忽略默认情况下通过命令“ls”,它与“隐藏”文件具有或多或少相同的效果,但并不相同(其他命令可以选择执行相同或不执行相同操作)。以点开头的文件不是“隐藏”的,因为“隐藏”不是它们的属性之一。与 DOS/Windows 不同,“隐藏”在 Unix 中不是一个属性。Unix 中有很多属性(“man chattr”会告诉您所有属性),但隐藏不是其中之一。

点文件被“ls”忽略的原因实际上很有趣/令人尴尬。这不是一个设计决定,而是Unix 早期软件错误的结果。当特别的时候。并且..目录条目已添加到文件系统中,因此决定 ls 命令不应显示它们,因为它们会妨碍。然而,该程序是匆忙编写的,以排除任何名称以 .字符,而不是确切的名称“。”或者 ”..”。并且开创了 Unix 从此沿袭的先例。有趣的是,当 Unix 人员继续创建 Plan 9 时他们没有故意将点文件放入其中

答案3

是否可以隐藏文件以及隐藏文件的条件取决于您使用的文件系统及其驱动程序。传统的 Unix 文件系统没有文件的“隐藏”属性。

文件系统驱动程序可以隐藏它想要的任何文件,只需在向用于获取目录列表的系统调用提供结果时省略文件名即可。正如 sergut 在他的回答中所描述的那样,以点开头的文件并没有真正隐藏。

(这也是 rootkit 隐藏其文件的方式:它们挂钩生成目录列表的系统调用,并过滤掉它们想要隐藏的文件。)

例如,在 Oracle ACFS 集群文件系统中,目录<filesystem mountpoint>/.ACFS/是真正隐藏的:它根本不会列出,即使使用ls -a.但如果您知道它在那里,您就可以正常访问它。

如果您使用 ACFS 文件系统的快照功能,则可以通过该.ACFS目录访问该文件系统的任何现有文件系统快照。如果它没有被隐藏,备份程序可能最终会备份文件系统的当前内容和任何现有快照的内容,这可能是不可取的;通常,您需要备份当前状态或一个特定快照的状态。

相关内容