查找在符号链接路径上不起作用?


15

如果我运行此命令,则find $HOME/MySymlinkedPath -name "run*.sh"什么也不会发生,也不会出错(“ MySymlinkedPath”是到另一个硬盘驱动器的符号链接路径,而不是我的$ HOME路径)。

这些也会失败:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

只是为了确保,这个不存在的路径失败了(当然),find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"所以找到了该路径(因为不会发生错误),但是find没有对该路径执行搜索,我现在很无能为力。

仅当我cd $HOME/MySymlinkedPath先删除路径引用后才起作用,find -name "run*.sh"但这对我的脚本不利。

附加信息
此命令照常运行ls $HOME/MySymlinkedPath/run*.sh,如果我去那里cd $HOME/MySymlinkedPath运行该命令ls ..,结果将不是我所期望的-符号链接路径所在的路径列表-返回实际路径的列表另一个媒体/硬盘!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

重新思考:和或我的系统
是否有问题?还是可以预期的,根本不是问题??我在Ubuntu 12.10上。它在我测试过的所有终端上均失败,因此似乎没有终端“问题”。findls


1
我找到了一个更好的答案“找到-跟随”。stackoverflow.com/questions/105212/…–
Jarod

@Jarod手册页说-follow已过时,我们应该使用-L(也就是--follow)作为我在下面的答案:>
Aquarius Power

Answers:


20

是答案。但是这个问题指出bash是问题的目标。

解释是find发现"$HOME/MySymlinkedPath"。它是一个符号链接,而不是目录,因此递归下降在此停止。如果表达式匹配"$HOME/MySymlinkedPath"(例如in中find "$HOME/MySymlinkedPath" -name 'My*'),find则将其打印为匹配项。

如此处指出的那样,我发现处理它并修复所有脚本的最简单/最干净的方法是:

find "$HOME/MySymlinkedPath" -name "run*.sh"

只需添加一个斜杠,这样find就不会从符号链接开始,而要从符号链接的目标开始:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

或者,将-H选项传递给find(注意,它必须在路径之前排在最前面),以告诉它遍历在其命令行上传递的符号链接。(这与-L告诉find您遍历递归下降过程中遇到的符号链接不同。)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

最后,它在这里最适合-L(因为我通过文件夹建立了符号链接的几个文件系统)。但是它会产生大量无问题的错误信息,因此我加了2>/dev/null; 并且还决定创建此别名alias find='find -L'

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
恕我直言,通常最好的做法是在目录后使用斜杠来表示它们实际上是目录。:)使内容更具可读性,等等
dannysauer
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.