扩展疑点

fic*_*ich 2 shell bash

如果我在一个文件夹中,我想找到 jpg 文件,我可以运行

find -type f -name "*jpg"
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么我必须使用双引号。我知道没有它们,路径名扩展会弄乱 find 命令(如果文件夹中有多个 jpg 文件),但不知道确切原因。我不太明白为什么这里的引号不能避免 shell 的扩展。

Pau*_*ant 10

双引号和单引号都可以防止 shell 中的文件名扩展。

Find 有点特殊,因为它会遍历目录的所有级别。

如果您不在命令中引用-name选项find,shell 会立即在您运行 find 的目录中展开名称表达式。这可能匹配文件零次、一次或多次。

对于没有 shell 匹配的情况,*jpg只会将其放回命令行并find作为选项传递给。

对于一次匹配,将实际名称(例如K3256.jpg)传递给 find,因此它只会在较低目录中查找具有该确切名称的文件。

对于多个匹配项,将在 find 命令行中放入多个名称,并且 find 将拒绝运行,因为参数的语法将是错误的。

Find 本身负责在它下降到的每个目录中扩展通配符。它不希望来自 shell 的任何错误的帮助。

Shell 在调用 find 作为新进程之前删除引号。这避免了所有程序都必须处理引号,引号是 shell 语法的严格组成部分。当子进程看到 args 时,它们已被转换为空终止字符串数组,不需要进一步修饰。

find命令以与 shell 完全相同的方式理解和操作文件名扩展。不同之处在于它会find遍历目录的所有级别,并且在每个目录中读取其中的名称列表,并将该级别的每个名称与 -name 模式进行匹配。

另请注意,该-type f选项也在每个子目录中起作用:目录条目也包含该信息,因此 find 必须在目录树的每个分支上重新处理文件类型和名称匹配。

另请参阅此答案

  • @fich `find` 命令进行模式匹配,有点像扩展。但是只有在 shell 没有先扩展它的情况下它才能做到这一点。引号会阻止 shell 扩展它,但它们在 `find` 看到模式之前(被 shell)删除,所以它们不会阻止 `find`“扩展”(实际上匹配)它。 (2认同)