为什么 find 有时会匹配其命令行路径参数?

Yor*_*ork 9 find

在 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 .仅匹配起始目录(.在递归遍历期间永远找不到)。


Hau*_*ing 5

在应用测试之前没有对命令行参数进行规范化。因此,结果因使用的路径而异(如果涉及符号链接):

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),则可以使用。