在 Linux 上,
cd /tmp
mkdir foo; cd foo
Run Code Online (Sandbox Code Playgroud)
现在,运行
find . -name 'foo'
Run Code Online (Sandbox Code Playgroud)
没有输出。而跑步
find /tmp/foo -name 'foo'
Run Code Online (Sandbox Code Playgroud)
给出/tmp/foo对我来说没有意义的输出。有人可以解释为什么吗?
Gil*_*il' 15
find遍历指定的目录树,并为它找到的每个文件计算给定的表达式。遍历从给定的路径开始。以下是操作方式的摘要find . -name foo:
.
.)是否与模式匹配foo?不,所以什么都不做。/tmp/foo是同一目录的另一个名称。但find不知道(也不应该试图找出答案)。.,并对每个条目执行遍历过程。
.and之外的任何条目..,它find不会递归遍历。这样工作就完成了。并且find /tmp/foo:
/tmp/foo
foo)是否与模式匹配foo?是的,所以条件匹配。
/tmp/foo,并对每个条目执行遍历过程。
.and之外的任何条目..,它find不会递归遍历。这样工作就完成了。碰巧.和/tmp/foo是同一个目录,但这不足以保证find两者具有相同的行为。该find命令具有区分同一文件路径的方法;该-name谓词是其中之一。find /tmp/foo -name foo匹配起始目录以及它下面的任何名为foo. find . -name .仅匹配起始目录(.在递归遍历期间永远找不到)。
在应用测试之前没有对命令行参数进行规范化。因此,结果因使用的路径而异(如果涉及符号链接):
cd /tmp
mkdir foo
ln -s foo bar
find /tmp/foo -name foo
find /tmp/bar -name foo
Run Code Online (Sandbox Code Playgroud)
在“您的情况”中,两个调用都会给出相同的结果,这可能(更)令人困惑。-mindepth 1如果您希望忽略起点(可能是非 POSIX),则可以使用。