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

Joe*_*nar 9 command-line files directory symbolic-link

我有更新软件/opt/minergate-cli。我已经改名目录minergate-climinergate-oldmv命令,然后安装软件给予相同的目录名的新版本。

假设我有一个旧程序,现在有一个同名的新程序,即“minergate”,指向程序 minergate 的任何符号链接会发生什么?

他们是指向原来的程序minergate-old,还是指向新程序的链接minergate.cli

Ser*_*nyy 9

概括

  • 符号链接不跟随它们指向的文件。如果你有link_file -> original_file并且你做mv original_file original_file.backup了,link_file就会被打破

  • 如果您重新创建原始文件名(这是 OP 所做的),符号链接将再次起作用

  • 如果你必须 make 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
Run Code Online (Sandbox Code Playgroud)

现在让我们重命名文件。你会看到符号链接仍然指向不再存在的路径名(这很重要,文件存在,路径名 - 不存在):

$ 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
Run Code Online (Sandbox Code Playgroud)

如何修复损坏的符号链接?

如果您可以将文件重命名为原始路径名,符号链接将开始工作。

$ 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
Run Code Online (Sandbox Code Playgroud)

OP 问题:链接是否已移至新程序minergate.cli

如果在/opt/minergate-cli安装新版本的应用程序时重新创建了符号链接目标,则符号链接将指向新文件。如果新文件具有不同的文件名,则符号链接将被破坏。如果文件名被移动,mv /opt/minergate-cli /opt/minergate.old符号链接不会跟随文件名,就像在 OP 的示例中那样,因此/opt/minergate-cli无论该文件是否存在,符号链接仍将继续指向。

也可以看看


gle*_*man 7

符号链接只保存它指向的文件的名称。(提示,做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
Run Code Online (Sandbox Code Playgroud)

您可能会想到一个“硬”链接,它指的是目标文件的inode

$ 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
Run Code Online (Sandbox Code Playgroud)

hardlink原始file文件相同的文件。