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

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

如果我运行此命令,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

重新思考
这是 和 的问题findls还是我的系统的问题?或者这是预期的并且根本不是问题?我使用的是 Ubuntu 12.10。它在我测试的所有终端上都失败了,所以似乎不是终端“问题”。

答案1

这里就是答案。但这个问题指出 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

相关内容