如果我运行此命令,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
重新思考:
这是 和 的问题find
,ls
还是我的系统的问题?或者这是预期的并且根本不是问题?我使用的是 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