当原始文件被替换时,符号链接会发生什么?

当原始文件被替换时,符号链接会发生什么?

我已更新中的软件。我已使用命令/opt/minergate-cli将目录重命名minergate-cli为,然后安装了使用相同目录名的较新版本的软件。minergate-oldmv

假设我有一个旧程序,现在有一个同名的新程序,即“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文件一样。

相关内容