删除系统中所有断开的符号链接是否不利?


46

我正在运行一个脚本,该脚本遍历我的Linux系统上的所有文件并创建有关它们的一些元数据,并且在命中断开的符号链接时引发了错误。

我是* nix的新手,但是我得到了链接文件背后的主要思想以及断开的链接是如何存在的。据我所知,它们就像街上的垃圾一样。我要删除的程序不足以告诉程序包管理器存在,属于它,或者在升级中遗留下来的东西。最初,我开始调整正在运行的脚本以跳过它们,然后我想,“好吧,我们一直可以在到这里时删除它们...”

我正在运行Ubuntu 14.04(Trusty Tahr)。我看不出有什么理由不这样做,但是在继续在开发系统上运行它之前,是否有任何理由实际上可能是一个糟糕的主意?损坏的符号链接是否可以达到我不知道的目的?


7
是的:请在下面的答案中打勾。但更重要的是,这不是解决问题的方法:脚本必须正常运行,而不仅仅是经过清理的系统。在清理到脚本运行的第二部分之间的1/2毫秒内,系统可能会被清理。这也违反了单一责任原则和Unix哲学:“做一件好事”。
ctrl-alt-delor 2014年

Answers:


68

断开符号链接的原因有很多:

  • 已创建到一个不再存在的目标的链接。
    解决方法:删除损坏的符号链接。
  • 为已移动的目标创建了一个链接。还是相对链接已相对于其目标进行了移动。(并不是暗示相对符号链接是一个坏主意-相反:绝对符号链接更容易过时,因为它们的目标已移动。)
    解决方案:找到所需的目标并修复链接。
  • 创建链接时出错。
    解决方法:找到预期的目标并修复链接。
  • 链接指向可移动磁盘,网络文件系统或当前未安装的其他存储区域上的文件。解决方法:无,链接不会一直断开。安装存储区后,该链接将起作用。
  • 链接是指向设计上仅在某些时间存在的文件的。例如,文件是进程的缓存输出,当信息过时时将其删除,但仅在明确请求时才重新创建。或链接指向收件箱,该收件箱为空时将被删除。或链接指向仅在连接了相应外围设备时才存在的设备文件。解决方法:无,链接不会一直断开。
  • 该链接仅在不同的存储层次结构中有效。例如,它仅在chroot监狱中有效,或者由NFS服务器导出,并且仅在服务器或其某些客户端上有效。
    解决方法:无,链接并没有在任何地方断开。
  • 该链接对您来说是断开的,因为您没有遍历目录到达目标的权限,但是对于具有适当特权的用户而言,该链接没有断开。
    解决方法:无,每个人的链接都不会中断。
  • 该链接用于存储信息,如vinc17引用Firefox锁定示例中所示。这样做的一个原因是,原子地填充符号链接更容易-没有其他方法,而原子地填充文件则更复杂:您需要以临时名称创建文件内容,然后将其移动到位,然后处理崩溃后遗留下的过时的临时文件。另一个原因是符号链接通常直接存储在某些文件系统的索引节点内部,这使得读取它们的速度比读取文件内容的速度更快。
    解决方法:无。在这种情况下,删除链接将是有害的。

如果您可以确定符号链接属于第一类,那么可以肯定地继续删除它。否则,弃权。

递归遍历目录并关心文件内容的程序通常应忽略断开的符号链接。


符号链接(通常)不包含在其父目录中。但是,在某些文件系统上,链接目标存储在inode中。
James Youngman

很好的清单。我有一堆属于4型和6型的链接。它们指向我通过SSHFS挂载的文件系统。未挂载文件系统时,它们的类型为4;挂载文件系统时,只有我可以访问它,因此其他所有用户(甚至是root)的类型均为6。
Barmar 2014年

符号链接损坏的另一个可能原因:指向实际文件的符号链接仅在某些时间存在。例如,在具有深路径的工作流程中,您可能具有一个指向工作文件的符号链接(为方便起见),该符号链接在工作流程完成后会被删除,但会在下一次使用该工作流程时重新创建。/ dev / modem很像,因为它指向的实际设备文件仅在连接物理设备时存在。
2014年

相当全面的答案!
njzk2 2014年

1
@MichaelDurrant嗯?关键是缺点(或不足之处)取决于断开的符号链接的产生方式。
吉尔斯(Gilles)'所以

19

不要盲目删除所有悬挂的符号链接。它们可能只是为了携带一些信息而存在,并且由于符号链接的创建是原子的,因此它们可能比普通文件更安全。

例如,Firefox创建一个锁文件“ lock”,它是一个符号链接,其值的格式类似于“ IP_address:+ PID”。


1
像这样,程序可能会动态填充一个空白文件,这些符号链接之一是指向该链接的断开链接,而程序没有运行?还是可能只是一条信息?
blanket_cat

1
@knotech某些符号链接(不一定与正在运行的程序关联)的目的可能刚刚存在。它们的价值要么毫无意义,要么传达一些特定的信息。通常,在这两种情况下,它们都没有指向任何对象。没有空文件,只有符号链接。另请注意,例如,以gcc构建为例,它们创建指向自己的“邮票位”符号链接:gcc.gnu.org/ml/libstdc
++/2011-02/msg00014.html

6

无论是fnord加特林 Web服务器使用Unix文件系统作为其配置数据库(而不是,比方说,微软的IIS,它使用Windows注册表,或Apache,它采用了复杂的对解析配置文件)。

例如,虚拟主机只是目录,创建新的虚拟主机非常简单

mkdir www.example.com:80

配置要服务的文件?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

配置哪些文件可以作为CGI执行,哪些可以服务?

chmod a-x plain_file.html
chmod a+x cgi_script.html

最后(与这个问题相关):配置重定向?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

现在,您将有一个名为的符号链接search.html,该符号链接指向无处,但这对您网站的工作至关重要。


0

一个符号链接可能指向一个空的位置,只是强制在特定的文件系统位置或名称上进行创建。

因此,不要-不要盲目地将它们移除。


0

删除陈旧的符号链接的一个重要弊端是,您将失去对它们以前指向的位置的引用,而这可能是非常有价值的!

假设我有一个名为“ send_to” 的文件的符号链接,该文件指向/Users/myname/tmp并假定/Users/myname/tmp不存在。

通过符号链接,我知道文件的目标位置。例如,在这种情况下,我可以看到它是一个临时目录,如果需要“修复”它,则应将一个临时目录视为目标。

同样my_config,指向的链接“ ” /etc/conf_file变为“错误”,因为conf_file已将其重命名为确认文件仍然有用。如果您转到该/etc目录并执行,ls然后看到名为的文件conf_file丢失,但是confirmation_file在那里,您可能有足够的信息来修复此链接。


-2

Linux命令行(这是Linux新手有史以来最好的书,您可以在此处免费下载)上报价:

设想这种情况:程序需要使用包含在名为“ foo”的文件中的某种共享资源,但是“ foo”的版本更改频繁。最好在文件名中包含版本号,以便管理员或其他有关方面可以看到安装了哪个版本的“ foo”。这带来了问题。如果更改共享资源的名称,则必须跟踪可能使用共享资源的每个程序,并在每次安装新版本的资源时将其更改为寻找新的资源名称。听起来一点都不有趣。

这是符号链接节省时间的地方。假设我们安装了2.6版的“ foo”,其文件名为“ foo-2.6”,然后创建了一个符号链接,简称为“ foo”,它指向“ foo-2.6”。这意味着当程序打开文件“ foo”,实际上是在打开文件“ foo-2.6”。现在大家都很开心。依靠“ foo”的程序可以找到它,我们仍然可以看到安装了什么实际版本。当需要升级到“ foo-2.7”时,我们只需将文件添加到系统中,删除符号链接“ foo”,然后创建一个指向新版本的新链接。这不仅解决了版本升级的问题,而且还使我们可以将这两个版本保留在我们的计算机上。想象一下“ foo-2.7”存在一个错误(该死的开发人员!),我们需要恢复到旧版本。再次,

因此,不,我不会删除符号链接,因为这肯定会令人头痛,并且冒着严重破坏系统的风险。


6
该OP不提倡删除符号链接吹捧法庭 -仅符号链接,即符号链接不指向任何当前现有的文件。
LSerni 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.