扩张疑虑

扩张疑虑

如果我在一个文件夹中并且想要查找 jpg 文件,我可以运行

find -type f -name "*jpg"

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

答案1

双引号和单引号都会阻止 shell 中的文件名扩展。

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

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

如果没有 shell 匹配,*jpg则将其放回命令行并find作为选项传递。

对于一场比赛,实际名称(例如K3256.jpg)被传递给 find,因此只会在较低目录中查找具有该名称的文件精确的姓名。

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

Find 自身负责在其进入的每个目录中扩展通配符。它不希望 shell 提供任何错误的帮助。

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

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

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

另请参阅这个答案

相关内容