有没有办法找到所有没有指向的符号链接?

find ./ -type l


将为我提供所有符号链接,但对位于某处的链接和未链接的链接没有区别。

我目前在做:

find ./ -type l -exec file {} \; | grep broken


但是我想知道还有哪些替代解决方案。

#1 楼

我强烈建议不要对任务使用find -L(请参阅下面的说明)。以下是执行此操作的其他方法:



如果要使用“ pure find”方法,则应该看起来像这样: />
find . -xtype l


xtype是在取消引用的链接上执行的测试)但是,可能并非在所有版本的find中都可用。但是还有其他选项:


您还可以从test -e命令中执行find

find . -type l ! -exec test -e {} \; -print



即使是某些grep技巧也可能比find -L更好(即更安全),但与问题中提出的不完全一样(它会在整个输出行中晃动,包括文件名):
>

commandlinefu的solo引用的find -L技巧看起来不错而且很hacky,但是它有一个非常危险的陷阱:遵循所有符号链接。考虑目录,其内容如下所示:如果在该目录中运行find -L . -type l,则还将搜索所有/usr/share/(这可能会花费很长时间)1。对于“不受外发链接干扰”的find命令,请不要使用-L。所有/usr/share)–但可能会产生更严重的后果。例如,考虑chroot环境:它们可以存在于主文件系统的某些子目录中,并且包含指向绝对位置的符号链接。这些链接对于“外部”系统而言似乎是断开的,因为它们仅在您输入chroot后才指向正确的位置。我还记得有一些引导程序在/boot下使用了符号链接,这些符号链接仅在初始引导阶段才有意义,此时引导分区以/挂载。来自看起来无害的目录的符号链接,甚至可能破坏系统...

评论


我认为-type l是多余的,因为-xtype l在非链接上将作为-type l运行。因此,找到-xtype l可能就是您所需要的。感谢您的这种方法。

– Quornian
2012年11月17日在21:56

请注意,这些解决方案不适用于所有文件系统类型。例如,它不能用于检查/ proc / XXX / exe链接是否损坏。为此,请使用test -e“ $(readlink / proc / XXX / exe)”。

– qwertzguy
2015年1月8日在21:37



@Flimm查找。 -xtype l的意思是“找到所有(最终)目标文件是符号链接的符号链接”。但是符号链接的最终目标不能是符号链接,否则我们仍然可以跟随该链接,它不是最终目标。由于没有这样的符号链接,我们可以将它们定义为其他符号链接,即断开的符号链接。

–弱
16年4月8日在4:57

@JoóÁdám“这只能是符号链接,以防它损坏”。给“断开的符号链接”或“不存在的文件”一个单独的类型,而不是使l重载,对我来说就不那么混乱了。

–弱
16年4月22日在12:19

最后的警告很有用,但是请注意,这不适用于-L hack,而是通常(盲目)删除损坏的符号链接。

–阿洛瓦·马哈德(Alois Mahdal)
16年7月15日在0:22

#2 楼

来自http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz的symlinks命令可用于识别具有各种特征的符号链接。例如:

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a


评论


这个工具可用于osx吗?

– q
2014年7月27日在20:32

没关系,编译它。

– q
2014年7月27日在20:51

显然符号链接已预先安装在Fedora上。

–丹尼尔·琼森(Daniel Jonsson)
15年4月11日在22:11

#3 楼

正如rozcietrzewiacz所说,find -L将搜索扩展到符号链接目录中可能会产生意想不到的结果,因此这不是最佳方法。还没有人提到

find /path/to/search -xtype l


是与
find /path/to/search -type l -xtype l

更简洁,逻辑上相同的命令。迄今为止,没有一种解决方案能够检测到循环符号链接,这是另一种破坏方式。这个问题解决了可移植性。总而言之,查找损坏的符号链接(包括循环链接)的可移植方法是:

find /path/to/search -type l -exec test ! -e {} \; -print


有关更多详细信息,请参阅此问题或ynform.org。当然,所有这些的最终来源是findutils文档。

评论


简短,简洁并解决了find -L陷阱以及周期性链接。 +1

– Flimm
2014年10月7日13:00

真好最后一个也可以在MacOSX上运行,而@rozcietrzewiacz的回答没有。

– neu242
16年8月1日在10:03

@ neu242这可能是因为-xtype在POSIX中未指定,实际上,如果您在macOS中查看find(1),它具有-type但没有-xtype。

–Pryftan
19-10-1在14:35

#4 楼

我相信在命令中添加-L标志将使您摆脱grep:

$ find -L . -type l


http://www.commandlinefu.com/commands/view/ 8260 /发现残破的符号链接

来自男人:

 -L      Cause the file information and file type (see stat(2)) returned 
         for each symbolic link to be those of the file referenced by the
         link, not the link itself. If the referenced file does not exist,
         the file information and type will be for the link itself.


评论


起初我对此表示赞同,但后来我意识到它可能有多危险。在使用它之前,请先看看我的答案!

–rozcietrzewiacz
2012年5月15日7:37

#5 楼

如果您需要不同的行为(无论链接是断开还是循环的),也可以将%Y与find配合使用: 。

参考文献


查找


评论


对于那些find命令不支持xtype的人来说,还有一个缩写:find。输入l -printf“%Y%p \ n” | grep -w'^ N'。当安迪(Andy)在他的剧本中以相同(基本)的想法击败我时,我不愿意将其作为单独的答案来写。 :)

–syntaxerror
2015年6月25日在0:28



#6 楼

对于zsh用户:

rm -v **/*(-@)


来自zsh用户指南(搜索broken symlinks

#7 楼

简单的答案,这是OP版本的变体。有时,您只是想输入一些容易记住的内容:

find . | xargs file | grep -i "broken symbolic link"


或者,如果您需要处理NULL终止符:

find . -print0 | xargs -0 file | grep -i "broken symbolic link"


评论


同样,您也可以找到find。 > / dev / null,然后仅查看stderr输出。

– Sridhar Sarnobat
1月30日1:18

#8 楼

我将此用于我的情况,并且效果很好,因为我知道用于查找损坏的符号链接的目录:


跨设备链接以及对chroot有效的链接等仍然是一个陷阱,但对于我的用例来说,就足够了。

#9 楼

find -L . -type l |xargs symlinks将基于每个找到的文件为您提供该链接是否存在的信息。

#10 楼

这将在当前目录中打印出损坏的符号链接的名称。

for l in $(find . -type l); do cd $(dirname $l); if [ ! -e "$(readlink $(basename $l))" ]; then echo $l; fi; cd - > /dev/null; done


在Bash中工作。不了解其他外壳。