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

Aqu*_*wer 18 find path symlink

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

这些也失败了:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"
Run Code Online (Sandbox Code Playgroud)

为了确保这一点,这条不存在的路径失败了(当然)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
Run Code Online (Sandbox Code Playgroud)

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

Aqu*_*wer 22

是答案。但是这个问题指向 bash 作为问题的目标。

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

正如那里所指出的,我发现处理它和修复所有脚本的最简单/最干净的方法是,而不是:

find "$HOME/MySymlinkedPath" -name "run*.sh"
Run Code Online (Sandbox Code Playgroud)

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

find "$HOME/MySymlinkedPath/" -name "run*.sh"
Run Code Online (Sandbox Code Playgroud)

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

find -H "$HOME/MySymlinkedPath" -name "run*.sh"
Run Code Online (Sandbox Code Playgroud)

最后它在这里工作得最好-L(因为我通过文件夹符号链接了几个文件系统)。但它会产生大量没有问题的错误消息,所以我补充说2>/dev/null;并决定创建这个别名alias find='find -L'

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言,通常在目录后使用斜杠表示它们实际上是目录是一种很好的做法。:) 使事情更具可读性,等等。 (2认同)