关于 -path for find 的更多问题

关于 -path for find 的更多问题

https://unix.stackexchange.com/a/81379/674

  1. -path不(重新)定义起始路径。它是指当前检查对象的起始路径和相对路径的组合。

    • “起始路径”是否意味着path? find: 的参数

      find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression]
      
    • “当前检查对象的起始路径和相对路径的组合”是什么意思?

  2. 例如,您可以通过此查找子目录中的所有文件,src无论在哪个级别。

    “查找子目录中的所有文件,src无论在哪个级别”是如何完成的?

  3. “不要特别对待 / 或 .”意味着*可以匹配两个文件名(包括扩展名)和子目录:[...]/file* 将匹配/file.txt/files/foo.bar

    “不特别对待/或.”没有提到*,那么“不特别对待/或.”是否仅适用于*

答案1

  1. 是的,“开始路径”是指出现在命令开头附近find、选项之后但表达式之前的目录名称之一。我将您链接到的问题解释为表明OP对两者之间的区别感到困惑

    find /etc ...
    

    find -path /etc ...
    

    • “它指的是当前检查对象的起始路径和相对路径的组合。”

      我猜这个答案的作者想象你有一个名为 的目录tools/crowbar,其中包含文件drinkfoodfoolishnesswisdom。如果你说

      find tools/crowbar -path "*bar/foo*"
      

      它将找到 和,但不会找到其他两个。tools/crowbar/foodtools/crowbar/foolishness

  2. 我同意 lcd047 的观点。换句话说,如果你有一个像这样的目录结构

    
    ├────猫
    │ ├────狗
    │ │ └────狗舍
    │ └────tac
    │ └────src
    ├────目的地
    ├────原创
    │ ├────食谱
    │ └────src
    └────源

    然后

    find . -path "*/src/*"
    

    src将在所有三个文件夹(及其所有子目录)中查找内容,而不报告catcat/dogcat/dog/kennelcat/tacdestoriginal或中的内容original/recipe

  3. 它有助于阅读整个段落,而不仅仅是挑选句子片段并期望它们单独有意义。-path测试中的讨论查找(1)说,

    -path pattern

      文件名与 shell 模式匹配图案。元字符不特殊对待 ' /' 或 ' .';所以,例如,
          寻找 。 -路径“./sr*sc”

      将打印名为“ ”的目录的条目./src/misc(如果存在)。 ...

    好的,当您在同一行看到“文件名”、“shell 模式”和“元字符”时,您应该会想到 shell 的模式匹配/路径名扩展,它具有特殊的模式字符 *,?, 和[...]。 (“元字符”基本上是一个价值 10 美元的“特殊字符”单词。)然后它会向您显示一个*其中包含 a 的示例!所以你应该能够弄清楚它在说什么。

    那么,它在说什么?看一下例子:sr*scmatches src/misc。这与 shell 中的路径名扩展不同,在 shell 中您通常需要使用诸如match 之类的东西。而且,不,这不仅仅适用于; 并 以同样的方式工作。sr*/*scsrc/misc*-path "sr????sc"-path "sr[cim/][cim/][cim/][cim/]sc"

    他们懒得提及的是-path "*sr*sc" 不仅会匹配src/misc而且还会.src/misc匹配src/.misc;即使*sr*/*sc通常不会匹配这些(在 shell 中),因为在 shell 的路径名扩展中, *通常不匹配以 .

答案2

为了避免混淆,您可能应该将原型想象成find(1)这样:

find [-H] [-L] [-P] [-D debugopts] [-Olevel] [dir...] [expression]

find(1)查找 中的文件direxpression是由应用于找到的文件的测试组成的逻辑表达式。 -path-name-type是此类测试的示例。

  1. 上面基本上说-pathdoes not set dir,但它的参数被视为相对于dir

  2. -path '*src*'匹配./src/foo/bar/test.c./foo/src/bar/test.c,但不匹配./foo/bar/test.c

  3. said*是一个通配符,它​​可以跨目录匹配。它还说您不应该将其与*DOS / Windows 世界混淆,在 DOS / Windows 世界中您需要编写*.*以匹配具有“扩展名”的文件。

或者至少这是我的理解。

相关内容