可以创建“跟随”文件的符号链接吗?

行为:
me@local: tree
.
|-- ba
|   `-- file.txt
|-- foo
|   `-- file.txt -> ba/file.txt
`-- foobar

现在,假设我将文件.txt从ba移动到foobar
me@local: mv ba/file.txt foobar/file.txt

我注意到 foo 文件夹中的符号链接仍然指向 ba/file.txt 路径。

有没有一种方法可以创建符号链接,在源文件移动时自动更新路径?

或者在删除源文件时删除符号链接?

这将非常好。

4个回答

你可以创建硬链接。
硬链接有自己的缺点,例如无法链接到目录,不能在文件系统之间建立链接。而且当你删除“原始文件”时,它们并不会被删除;实际上,它们会阻止驱动空间被释放,你仍然可以通过硬链接访问内容。
你不能在文件浏览器(Files,前身为Nautilus)中创建硬链接,但是关于这个问题有一个旧的bug report(已关闭,不修复)。

3软链接是新来的孩子,我认为其他只允许软链接的操作系统导致人们从未知道 ln 在没有 -s 的情况下也可以工作 ;) - msw
2msw是正确的,由于某种原因,我一直不敢在ln中使用-s选项,我从未认为这样做是合适的。实际上,除非您有疯狂的分区方案并经常在它们之间移动文件,否则这不是问题。 - TJ L
我不认为硬链接实际上能做你所要求的任何一件事情。它们不能在源文件移动时自动更新路径,也不会在我删除源文件时被删除。 - Ben Williams
@Ben:是的,它们可以满足我的需求,如果我移动一个文件,硬链接也会跟随它。 - Strae
就个人而言,我认为硬链接在一般情况下是一个不好的主意。我发现使用硬链接存在很多陷阱,而且每天都在发现更多。请参考http://superuser.com/questions/402295/what-are-the-pitfalls-of-hardlinked-files-on-my-desktop-pc - MountainX
有一个新的错误要求添加对硬链接的支持。 - Pablo Bianchi

据我所知,使用普通的Linux文件系统无法做到这一点。

符号链接只是一个简单的文本,它表示"看,我真的叫做Foo" - 没有检查Foo是否存在,正如你已经发现的那样。你可以很轻松地创建指向空内容的符号链接,就像你可以创建指向有效内容的符号链接一样。

也许对于除了ext2/3/4之外的更高级文件系统(比如jfs?或zfs?或zfs?),有更多文件系统知识的人可能能够说在这些更先进的文件系统下是否可能实现这一点。也许NTFS甚至支持这个功能?NTFS没有类似的符号链接,但有一个类似的特性叫做Junction Points


是的,你可以。

在命令行中,你必须输入:

ln ba/file.txt foo/file.txt

这是一个强链接,即使你删除了ba/file.txt文件,它仍然存在于foo/file.txt中(你可以用ls -l命令查看有多少链接)

如果你想做你所做的事情(创建一个符号链接),你必须输入:

ln -s ba/file.txt foo/file.txt

编写一个脚本或程序,为文件添加xattr,告诉它指向它的符号链接的路径。然后编写一个包装器脚本,用于更新源文件移动时符号链接的目标。

虽然我只是半开玩笑,并且这是一个可行的解决方案,但有那么多壁垒情况(与角落或边缘情况相反...),肯定会引起很多头痛(例如,使用其他程序移动文件)。