如果我在一个文件夹中并且想要查找 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 必须在目录树的每个分支上重新处理文件类型和名称匹配。
另请参阅这个答案