如何自动查找和报告损坏的符号链接?

wom*_*ble 10 unix symbolic-link

作为整洁的系统管理员,我们希望确保小事与大事一样得到妥善处理(在时间允许的情况下)。其中一件事是确保我们的系统不会充满损坏的符号链接。

为什么这些小疫病是一个问题?因为当它们不存在时,它们会让您认为文件在那里,它们可能表明一些更烦人的事情,并且因为我的(小)OCD 部分在运行某些命令(如grep -r)时会因所有这些警告而发疯。

那么,如何检测(并通过电子邮件或监控系统报告)管理员负责的系统各部分之间的断开链接(告诉我~jbloggs有一堆断开的符号链接毫无意义,那是他的问题) )?

小智 7

问题-L在于 is 具有将搜索扩展到作为 目标的子目录的副作用symlinks,这可能不是预期的或不希望的。

GNU findutils版本find

<!-- language: bash -->
find /path/to/search -xtype l
Run Code Online (Sandbox Code Playgroud)

除了没有找到循环符号链接。

-execdir 在另一个答案中不是那么便携,因此将其提炼为可找到损坏的符号链接(包括循环链接)的便携解决方案:

<!-- language: bash -->
find /path/to/search -type l -exec test ! -e {} \; -print
Run Code Online (Sandbox Code Playgroud)

请参阅此问题ynform.org进行进一步讨论。另请参阅findutils 文档以了解详细信息。ynform.org 链接还提供了一种仅检测循环链接的方法。


use*_*517 6

给猫剥皮的多种方法

这是非常便携的(-L 是 posix 要求)

find -L /path/you/care/about -type l 2>/dev/null | mail -s "Broken symlinks detected" womble@example.com
Run Code Online (Sandbox Code Playgroud)

您没有定义损坏的,上面会向您发送损坏的链接,这些链接在您关心的文件系统部分没有目标。它还报告 stderr 文件系统循环和符号链接级别过多等问题。如果您也关心它们,则将 stderr 重定向到您的邮件

find -L /path/you/care/about -type l 2>&1 | mail ...
Run Code Online (Sandbox Code Playgroud)

如果您的发现支持它-readable是有用且快速的

find /path/you/care/about -type l ! -readable | mail ...
Run Code Online (Sandbox Code Playgroud)

以上包括在其输出中具有太多符号链接问题级别的链接,但不包括文件系统循环。

如果您关心的文件系统部分有不同的路径,那么

find /path/you/care/about /another/path ...
Run Code Online (Sandbox Code Playgroud)


grs*_*grs 0

我会给你一个 Linux 答案,如果需要,你可以将其调整为你的 Unix:

find . -type l ! -execdir test -e {} \; -print >> broken_symlinks.txt; mutt -s "Broken symlinks" womble@example.com < broken_symlinks.txt; rm -f broken_symlinks.txt

第二个选项是ls -LR | grep 'cannot access'对上面的 find 命令进行一些修改。

编辑:

是的,这更好:find . -type l ! -execdir test -e {} \; -print | mail -s "Broken symlinks" womble@example.com