![当原始文件被替换时,符号链接会发生什么?](https://linux22.com/image/1205031/%E5%BD%93%E5%8E%9F%E5%A7%8B%E6%96%87%E4%BB%B6%E8%A2%AB%E6%9B%BF%E6%8D%A2%E6%97%B6%EF%BC%8C%E7%AC%A6%E5%8F%B7%E9%93%BE%E6%8E%A5%E4%BC%9A%E5%8F%91%E7%94%9F%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我已更新中的软件。我已使用命令/opt/minergate-cli
将目录重命名minergate-cli
为,然后安装了使用相同目录名的较新版本的软件。minergate-old
mv
假设我有一个旧程序,现在有一个同名的新程序,即“minergate”,那么指向程序 minergate 的任何符号链接会发生什么?
它们是否指向原来的程序minergate-old
,或者链接是否移动到了新的程序minergate.cli
?
答案1
概括
符号链接不遵循它们指向的文件。如果你有
link_file -> original_file
并且你这样做,mv original_file original_file.backup
将会link_file
被破坏如果你重新创建原始文件名(这是 OP 所做的),符号链接将再次起作用
如果必须创建
link_file -> original_file.backup
,则必须删除link_file
并重新创建,并指向新文件名
回答
如果我们重命名文件,符号链接会发生什么?
一旦移动符号链接指向的文件,符号链接就会断开,也称为悬空符号链接。如果要指向新文件名,则必须删除它并创建新的符号链接。
例如,让我们创建一个到文件的符号链接:
$ ln -s testfile.txt mysymlink
$ ls -l mysymlink
lrwxrwxrwx 1 adm adm 12 Dec 8 13:28 mysymlink -> testfile.txt
现在让我们重命名文件。您将看到符号链接仍然指向不再存在的路径名(这很重要,文件存在,路径名不存在):
$ mv testfile.txt testfile.txt.bak
$ ls -l mysymlink
lrwxrwxrwx 1 xie xie 12 Dec 8 13:28 mysymlink -> testfile.txt
$ cat mysymlink
cat: mysymlink: No such file or directory
如何修复损坏的符号链接?
如果您可以将文件重命名为原始路径名,则符号链接将开始工作。
$ mv testfile.txt.bak testfile.txt $ cat mysymlink 一二三
如果重命名不是一个选项并且您可能无法重命名文件,请创建一个新的符号链接并删除旧的符号链接。
# break the symlink
$ mv testfile.txt testfile.txt.bak
$ cat mysymlink
cat: mysymlink: No such file or directory
# remove the old symlink
$ rm mysymlink
# create symlink with same filename but pointing to new pathname
$ ln -s testfile.txt.bak mysymlink
$ cat mysymlink
one two three
OP问题:链接是否移至新程序
minergate.cli
?
如果在安装新版本的应用程序时重新创建了符号链接目标/opt/minergate-cli
,则符号链接将指向新文件。如果新文件具有不同的文件名,则符号链接将被破坏。如果文件名被移动,符号链接不会跟随文件名,就像 OP 示例中那样,因此无论该文件是否存在,mv /opt/minergate-cli /opt/minergate.old
符号链接仍将继续指向。/opt/minergate-cli
也可以看看
答案2
符号链接只保存姓名它指向的文件。(提示,执行ls -l symlink
并注意其文件大小)。如果您删除目标文件,然后创建一个具有相同名称的新文件,则符号链接将继续正常工作,并引用新文件的内容:
$ echo "first file" > file
$ ln -s file symlink
$ ls -l symlink
lrwxrwxrwx 1 jackman jackman 4 Oct 23 23:33 symlink -> file
# ...........................^=size ...................^^^^ target is 4 chars
$ cat symlink
first file
$ mv file file.old
$ echo "this is the second" > file
$ cat symlink
this is the second
你可能会想到“硬”链接,它指的是目标文件的索引节点:
$ echo "first line" > file
$ ln file hardlink
$ ls -li hardlink file
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 file
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 hardlink
$ cat hardlink
first line
$ mv file file.old
$ echo "this is the new contents" > file
$ cat hardlink
first line
$ ls -li hardlink file file.old
1059446 -rw-r--r-- 1 jackman jackman 25 Oct 23 23:39 file
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 file.old
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 hardlink
这里hardlink
是同一个文件与原始file
文件一样。