最近,我遇到了Python中的os
库,并发现了符号链接的存在。我想知道什么是符号链接,为什么存在,以及它的各种用途?
答案 0 :(得分:0)
我将从一个*nix用户(特别是Linux)的角度回答这个问题。如果您对与Windows有何关系感兴趣,建议您参考教程like this one。这将是一个回旋处,但我发现最好将符号链接或符号链接与硬链接和Linux上文件系统的通用属性一起解释。
根据经验,在Linux中,所有内容均视为文件。目录是包含从名称(路径)到inodes的映射的文件,它们只是系统上不同对象的唯一标识符。基本上,如果我给您一个类似/home/gst/mydog.png
的名称,则访问过程将首先进入/
目录(root directory),在该目录中将找到有关在何处home
的信息。 ,然后打开该文件,它将查看其中的内容以查看gst
的位置,最后在该文件中它将尝试找到mydog.png
的位置,如果成功,请尝试执行与设置有关的任何操作它。回到目录文件,它们包含的映射称为links
。这使我们进入了硬性和象征性的联系。
硬链接只是一种映射,就像我们之前讨论的那样。它直接指向某个对象。另一方面,符号链接不是直接指向对象。相反,它只是保存对象的路径。例如,假设我使用/home/gst/mydog.png
在/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
中将参数({可选)设置为follow_symlinks
的{{1}}调用函数时,也会发生这种名称解析,但是,如果将其设置为True
,则名称无法解析(例如,当您要操作符号链接本身而不是它指向的对象时,可以将其设置为false)。来自module documentation:
不遵循符号链接:如果 follow_symlinks 为
False
,并且要操作的路径的最后一个元素是符号链接,则函数将在符号链接本身而不是链接指向的文件。 (对于POSIX系统,Python将调用该函数的False
版本。)您可以使用os.supports_follow_symlinks检查平台上是否支持follow_symlinks。如果不可用,使用它将引发NotImplementedError。
这个问题已经here得到了回答,引用了被接受的答案:
硬链接的主要优点是,与软链接相比,没有大小或速度损失。软链接是普通文件访问之上的一个间接附加层。打开文件时,内核必须取消引用链接,这需要少量时间。该链接还占用磁盘上的少量空间,以保存链接的文本。硬链接不存在这些惩罚,因为它们内置在文件系统的结构中。
我想补充一点,硬链接允许一种简单的文件备份方法。对于每个文件,系统都会记录其硬链接数。一旦该计数达到0,文件所在的内存段就被标记为空闲,这意味着系统最终将用另一个数据覆盖它(有效地删除先前的文件-至少在运行时不会发生进程具有与文件关联的打开的流,但这是另一回事了。为什么会这样呢?
比方说,您有一个巨大的目录,其中充满了您想要以某种方式处理的文件(重命名某些文件,删除其他文件,等),然后编写脚本来为您完成此操作。但是,您不确定该脚本是否可以按预期运行,并且您担心它可能会删除一些错误的文件。您也不想复制所有文件,因为这会占用太多空间和时间。一种解决方案是在文件系统中的其他位置为每个文件创建一个硬链接。如果删除目标目录中的文件,则关联的对象仍然可用,因为存在与之关联的另一个硬链接。与复制所有文件相比,创建这么多硬链接所花费的时间和空间要少得多,但是它将为您提供合理的备份策略。
符号链接不是这种情况。请记住,符号链接指向其他链接(也可能是另一个符号链接),而不指向实际文件。因此,我可能会创建一个指向文件的符号链接,但是它只会保存链接。如果符号链接指向的(最终)硬链接已从系统中删除,则尝试解决符号链接将不会导致您找到文件。此类符号链接被称为“断开”或“悬挂”。因此,您不能依靠符号链接来保留对特定文件的访问。 (相反,删除符号链接不会影响与目标文件关联的链接数。)那么它们的用途是什么?
您可以对符号链接进行操作,就好像它们是实际指向的文件一样(删除它们除外)。这使您可以对一个文件具有多个“访问点”,而无需多余的副本(由于它们始终访问同一文件,因此它们是最新的)。如果要替换正在访问的文件,则只需更改一次,所有符号链接都将指向该文件(只要它们保存的路径未更改)。但是,如果您具有指向某个文件的硬链接,然后又用另一个文件替换了该文件,则还需要替换这些硬链接,否则它们仍将指向旧文件。
最后,在同一Linux机器上安装不同的filesystems并不少见。也就是说,数据在文件层次结构中某个位置(例如l...
)的组织和解释方式可能与在另一点(例如/home/gst/fs1
)的组织和解释方式不同。硬链接只能与指向的文件位于相同的文件系统上。鉴于可以在一个文件系统上创建符号链接,但可以有效地指向另一个文件系统上的文件(请参见对this question的回答)。