在文件之间创建符号链接的目的是什么?

Var*_*thy 7 symlink python-os

最近我偶然发现了osPython 中的库,并发现了符号链接的存在。我想知道什么是符号链接,它为什么存在,以及它的各种用途是什么?

gst*_*gst 18

我将从*nix用户(特别是 Linux)的角度来回答这个问题。如果您对这与 Windows 的关系感兴趣,我建议您查找类似这样的教程。这可能有点迂回,但我发现符号链接或符号链接最好与 Linux 上文件系统的硬链接和通用属性一起解释。

Linux 上的链接和文件

根据经验,在 Linux 中,所有内容都被视为文件。目录是包含从名称(路径)到inode 的映射的文件,这些文件只是驻留在系统上的不同对象的唯一标识符。基本上,如果我给你一个像/home/gst/mydog.png访问过程一样的名称,它将首先查看/目录(根目录),在其中它将找到有关在哪里查找的信息home,然后打开该文件,它将查看它的位置gst,最后在该文件中文件它会尝试找到 的位置mydog.png,如果成功,请尝试执行它指定的操作。回到目录文件,它们包含的映射称为links. 这给我们带来了硬链接和符号链接。

硬链接与符号链接

硬链接只是一种映射,就像我们之前讨论的那样。它直接指向某个对象。另一方面,符号链接并不直接指向对象。相反,它只是保存对象的路径。例如,假设我创建了一个到/home/gst/mydog.pngat 的/home/gst/Desktop/mycat.png符号链接os.symlink("/home/gst/mydog.png", "/home/gst/Desktop/mycat.png")。当我尝试打开它时,名称/home/gst/Desktop/mycat.png通常会解析为/home/gst/mydog.png. 通过遵循位于的符号链接,/home/gst/Desktop/mycat.png我实际上(尝试)访问 指向的对象/home/gst/mydog.png

如果我创建硬链接(例如通过调用os.link),我只需将条目添加到相关目录文件中,以便特定名称可以跟随链接对象。当我创建符号链接时,我创建一个包含另一个文件(可能是另一个符号链接)的路径的文件。

更具体地说,如果我传递/home/gst/Desktop/mycat.png给你的问题,os.readlink它将返回/home/gst/mydog.png。当使用设置os为 的(可选)参数调用函数时,也会发生此名称解析,但是,如果将其设置为名称,则不会解析该名称(例如,当您想要操作符号链接本身而不是操作符号链接时,您可以将其设置为 false它指向的对象)。来自模块文档follow_symlinksTrueFalse

不遵循符号链接:如果follow_symlinksFalse,并且要操作的路径的最后一个元素是符号链接,则该函数将操作符号链接本身而不是链接指向的文件。(对于 POSIX 系统,Python 将调用该l...函数的版本。)

您可以使用os.supports_follow_symlinks检查您的平台是否支持 follow_symlinks 。如果它不可用,使用它会引发NotImplementedError

为什么使用硬链接?

这个问题已经在这里得到回答,引用已接受的答案:

硬链接的主要优点是,与软链接相比,没有大小或速度损失。软链接是正常文件访问之上的额外间接层;当您打开文件时,内核必须取消引用链接,这需要少量时间。该链接还占用磁盘上的少量空间来保存链接的文本。硬链接不存在这些惩罚,因为它们内置于文件系统的结构中。

我想补充一点,硬链接提供了一种简单的文件备份方法。对于每个文件,系统都会保留其硬链接的计数。一旦此计数达到 0,文件所在的内存段将被标记为空闲,这意味着系统最终将用另一个数据覆盖它(有效地删除以前的文件 - 至少在运行时不会发生这种情况)进程有一个与该文件关联的打开的流,但那是另一个故事了)。为什么这很重要?

假设您有一个巨大的目录,其中充满了您想要以某种方式操作的文件(重命名一些文件、删除其他文件),并且您编写了一个脚本来为您执行此操作。但是,您并不完全确定该脚本是否会按预期工作,并且您担心它可能会删除一些错误的文件。您也不想复制所有文件,因为这会占用太多空间和时间。一种解决方案是在文件系统中的某个其他点为每个文件创建硬链接。如果删除目标目录中的文件,关联的对象仍然可用,因为有另一个硬链接与其关联。创建这么多硬链接将比复制所有文件消耗更少的时间和空间,但它将为您提供合理的备份策略。

符号链接的情况并非如此。请记住,符号链接指向其他链接(也可能是另一个符号链接)而不是实际文件。因此,我可能会创建一个到文件的符号链接,但它只会保存链接。如果符号链接指向的(最终)硬链接从系统中删除,则尝试解析符号链接不会引导您找到文件。此类符号链接被称为“损坏的”或“悬空的”。因此,您不能依赖符号链接来保留对某个文件的访问。(相反,删除符号链接不会影响与目标文件关联的链接计数。)那么它们有什么用呢?

为什么要使用符号链接?

您可以对符号链接进行操作,就好像它们是它们指向某处的实际文件一样(删除它们除外)。这允许您对一个文件拥有多个“访问点”,而无需拥有多余的副本(保持最新,因为它们始终访问同一文件)。如果要替换正在访问的文件,只需更改一次,所有符号链接都将指向它(只要它们保存的路径不更改)。但是,如果您有指向某个文件的硬链接,然后将该文件替换为另一个文件,则还需要替换硬链接,否则它们仍将指向旧文件。

最后,在同一台 Linux 机器上安装不同的文件系统并不罕见。也就是说,数据在文件层次结构中某个点(例如/home/gst/fs1)的组织和解释方式可能与在另一点(例如/home/gst/Desktop/fs2)的组织和解释方式不同。硬链接只能驻留在与其指向的文件相同的文件系统上。然而,可以在一个文件系统上创建符号链接,但有效地指向另一个文件系统上的文件(请参阅此问题的答案)。