重命名文件有效,但软链接指向旧名称。我该如何解决这个问题?

重命名文件有效,但软链接指向旧名称。我该如何解决这个问题?

例如,我正在重命名树中的许多文件,如下所示:

[bash]$ for file in `find . -name "*gsf*"`; do `mv $file ${file/gsf/msf}`; done

这会重命名文件名匹配中的所有“gsf”实例GSF到“msf”,但软链接继续指向现在不存在的包含“gsf”的文件。

例如,重命名后会发生以下情况:

lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so -> libgsf-1.so.114.0.23
lrwxrwxrwx 1 trusktr users     20 Apr 25 14:39 libmsf-1.so.114 -> libgsf-1.so.114.0.23
-rwxr-xr-x 1 trusktr users 265584 Apr 21 04:41 libmsf-1.so.114.0.23

正如您所看到的,软链接指向的libgsf-1.so.114.0.23已不再存在,因为它已重命名为libmsf-1.so.114.0.23.

我该怎么做才能使软链接指针也发生重命名?

答案1

除了技术解释之外,已经回答了。您可以更改符号链接指向的位置:

  1. 找到他们find . -type l
  2. 改变他们的目标ln -sfT target link_name

必须将选项-sfT指定为重新指向符号链接毫无意外。

答案2

没有什么;这就是使它们成为符号链接的原因,您需要自己处理它们。硬链接引用文件系统中的实际索引节点(“inode”),因此将保持有效;这正是在这种情况下您要使用硬链接而不是符号链接的原因。

答案3

根据@C2H5OH和@user1277476的回答,我想出了一个解决方案:

$ for file in `find . -type l`; do link=$(readlink $file); ln -sfT ${link//gsf/msf} $file; done

答案4

由于我无法添加注释,因此这里的版本不会调用 shell 来查找链接,从而防止由于 fork() 和其他系统调用而产生额外开销

for file in $(find . -type l); do 
    link=$(readlink $file); 
    ln -sfT ${link//gsf/msf} $file; 
done

这是基于 @trusktr 的回答

相关内容