如何在目录树中找到所有的符号链接?
如何查找目录树中的所有符号链接?
问题的原因:用户想要查找目录树中的所有符号链接,以便进行进一步的操作或分析。
解决方法:使用以下命令可以找到目录树中的所有符号链接:
find . -type l -ls
该命令从当前目录开始(`.`),查找所有的符号链接(`-type l`),并详细列出它们的信息(`-ls`)。
其他符号链接相关的find命令如下:
查找指向特定目标的符号链接:
find . -lname link_target
注意,`link_target`是一个可以包含通配符的模式。
查找损坏的符号链接:
find -L . -type l -ls
`-L`选项指示`find`在遇到损坏的符号链接时跟随它们。
查找并替换损坏的符号链接:
find -L . -type l -delete -exec ln -s new_target {} \;
更多的find命令示例可以在这里找到:[https://hamwaves.com/find/](https://hamwaves.com/find/)
如果希望更简洁,可以提到大多数版本的find命令都有一个`-ls`选项。因此,`find . -type l -ls`应该等同于上述命令。
这个解决方法改进了被接受的答案,因为它还告诉你符号链接在目录树中的位置,尤其在处理复杂且深层次的目录树时,这一点非常重要。
除非以root身份运行,否则该命令将无法访问任何无法到达的符号链接(这可能是你想要的)。为了彻底,可以使用`sudo sh -c 'find / -type l -ls > /symlink.list'`命令:这将列出整个文件系统中的所有符号链接,并将结果存储在由root拥有的文件`/symlink.list`中。
这个回答比被接受的回答更有用。另外,如果你想要查找指向某个目录中文件的符号链接:`find -lname '*/dir/*' -printf '%P -> %l\n'`。值得一提的是,`link_target`是一个模式。
如何在目录树中查找所有符号链接?
问题的出现原因是想要在目录树中找到所有的符号链接。解决方法是使用命令行工具来实现。
首先,可以使用以下命令来递归遍历`/path/to/folder`目录并仅列出符号链接:
ls -lR /path/to/folder | grep '^l'
如果想要跟随符号链接,可以使用`find`命令并加上`-L`选项。具体来说,`find`的手册中写道:
-L 跟随符号链接。当find检查或打印有关文件的信息时,将使用符号链接指向的文件的属性,而不是符号链接本身(除非它是一个损坏的符号链接或者find无法检查符号链接指向的文件)。使用此选项会隐含使用-noleaf选项。如果之后使用-P选项,-noleaf仍然会生效。如果-L生效且find在搜索过程中发现符号链接指向一个子目录,则会搜索该符号链接指向的子目录。 当-L选项生效时,-type谓词将始终与符号链接指向的文件类型匹配,而不是与符号链接本身匹配(除非符号链接已损坏)。使用-L会导致-lname和-ilname谓词始终返回false。
然后尝试以下命令:
find -L /var/www/ -type l
这应该能够工作。我在`find`的手册中找到了一个提示:如果使用了`-type`选项,则需要将其更改为`-xtype`选项:
l 符号链接;如果-L选项或-follow选项生效,则永远返回false,除非符号链接已损坏。如果想要在-L生效时搜索符号链接,请使用-xtype。
然后可以尝试以下命令:
find -L /var/www/ -xtype l
这应该能够解决问题。但是,我刚刚注意到`/var/www/`的内容已经是符号链接了,而这种方法似乎无法递归到这些目录中。你是否想要递归跟随符号链接?
是的,因为其中一些符号链接指向其他目录。我必须假设(希望)不会出现循环。
我理解`-L`选项的方式是它只匹配符号链接指向的文件类型。感谢你从手册中提取了这个信息,我之前没有注意到!
请参考我的答案的最终编辑(`find -L /var/www/ -xtype l`)。在你的`find`命令中,使用`-xtype`而不是`-type`应该能够解决问题。祝好运!
如果你还想处理“隐藏”的点文件夹,可以使用以下命令:ls -laR /path/to/folder | grep ^l
谢谢!但这只会显示链接的名称,而不会显示它们的位置。
在Mac OSX(10.9)中,不支持`-xtype`选项。似乎`find . -type l`命令可以递归检查。
使用`find (GNU findutils) 4.4.2`可以正常工作。另外,`-xtype -l`是“dash el”,而不是“dash one”。在SE上的代码格式使它看起来像是两个。
谢谢。第一个答案对于像我这样想要清理Dropbox内部链接的人来说是完美的。希望这个评论能让你的答案更容易找到。
如果只想要找到仅为文件的符号链接(完全忽略目录链接),可以使用以下命令:find -l /path/tosearch/ -xtype f
;或者对于指向各种非目录节点的符号链接:find -l /path/tosearch/ -not -xtype d
在Mac OSX(10.15.x / Catalina)中,仍然不支持`-xtype`选项。`-ls`可以显示详细信息(包括符号链接的目标文件)。对于一个有2个符号链接和2个真实文件的非符号链接目录来说,`find -L /var/www/ -type l -print0 -ls`不显示任何内容,`find -L /var/www/ -print0 -ls`显示所有4个文件(2个符号链接和2个文件)以及`/bar/www/`目录本身,`find /var/www/ -type l -print0 -ls`显示2个符号链接,`find /var/www/ -type f -print0 -ls`显示2个真实文件,`find /var/www/ -print0 -ls`显示4个文件(2个符号链接和2个真实文件)以及`/bar/www/`目录本身,`-not -type d`跳过目录。
如果想要一条命令列出所有符号链接及其目标,请使用:find -L . -type l -exec ls -l {} \;