如何在目录树中找到所有的符号链接?

17 浏览
0 Comments

如何在目录树中找到所有的符号链接?

我正在尝试找到我网站目录树中的所有符号链接。我知道可以使用find命令来实现,但我不知道如何递归检查子目录。

我尝试了以下命令:

find /var/www/ -type l

……后来我发现/var/www中的内容都是符号链接,所以我改变了命令:

find -L /var/www/ -type l

它运行起来需要一些时间,但是我没有找到任何匹配项。

如何让它检查子目录?

0
0 Comments

如何查找目录树中的所有符号链接?

问题的原因:用户想要查找目录树中的所有符号链接,以便进行进一步的操作或分析。

解决方法:使用以下命令可以找到目录树中的所有符号链接:

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`是一个模式。

0
0 Comments

问题的原因是用户想要找到一个目录树中的所有符号链接。用户试图使用find命令来完成这个任务,但是默认情况下find命令并不递归符号链接。用户尝试了使用-L标志来强制递归符号链接,但是并没有成功。

解决方法是使用-type l选项来告诉find命令只找符号链接文件。这样可以找到目录树中的所有符号链接,并显示它们的位置。用户感谢这个完美的解决方案。

0
0 Comments

如何在目录树中查找所有符号链接?

问题的出现原因是想要在目录树中找到所有的符号链接。解决方法是使用命令行工具来实现。

首先,可以使用以下命令来递归遍历`/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 {} \;

0