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)
重新思考:
这是find
and的问题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)