自动化修复所有损坏链接的过程

自动化修复所有损坏链接的过程

我的系统中有很多损坏的链接。我编写了一个脚本来重新链接所有断开的链接。但是,在脚本运行后,find 会再次显示链接仍然存在。

这是我的代码:

find /home/saman -lname '/home/saman/*' -exec \
   sh -c 'ln -snf "/home$(readlink "$0")" "$0"' {} \;

运行上面的命令后,我搜索损坏的链接,但仍然找到它们:

find . -type l | xargs file | grep broken 

我究竟做错了什么?

答案1

第一个问题是您的find命令只会查找使用完整路径的链接,而不是相对路径。为了显示:

$ ln -s /home/terdon/foo/NonExistantFile foo
$ ln -s NonExistantFile bar

$ tree
.
|-- bar -> NonExistantFile
`-- foo -> /home/terdon/foo/NonExistantFile

在上面的示例中,我创建了两个损坏的链接。第一个使用绝对路径,第二个使用相对路径。如果我现在尝试您的find命令(使用echo重新链接命令而不是运行它,以便我们可以看到它在做什么),则只会找到两者之一:

$ find . -lname '/home/terdon/*' -exec \
    sh -c 'echo ln -snf "/home$(readlink "$0")" "$0"' {} \; 
ln -snf /home/home/terdon/foo/NonExistantFile ./foo

第二个问题是你的路径错误。您正在将链接重新创建为"/home$(readlink "$0")" "$0".该readlink命令已经显示完整路径,因此添加/home到它会导致/home/home/...这不是您想要的。

更重要的是,你正在尝试的事情是不可能的。如果链接被破坏,则意味着其目标不存在。由于目标不存在,您不能简单地重新链接文件,没有地方可以链接它。您唯一能做的就是重新创建链接的目标。然而,这不太可能很有用,因为它只会使损坏的链接指向新的空文件。如果这确实是你想做的,你可以尝试

 find . -type l -exec sh -c 'touch "$(readlink "{}")" ' \; 

最后,您可能想要创建一个更复杂的脚本,i) 查找所有损坏的链接 ii) 在您的计算机中搜索与链接目标同名的文件 iii) 向您提供它们的列表 iv) 询问您是哪个它现在应该链接到的一个。

答案2

我的系统中有很多损坏的链接。我编写了一个脚本来重新链接所有断开的链接。但是,在脚本运行后,find 会再次显示链接仍然存在......

GNU Linux 系统上的这一行可能会引起人们的兴趣。我相信它来自@Giles,但我目前找不到参考资料。

find -xtype l -delete

它递归地查找并删除损坏的软链接。

相关内容