如果我在一个文件夹中,我想找到 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 必须在目录树的每个分支上重新处理文件类型和名称匹配。
另请参阅此答案
| 归档时间: |
|
| 查看次数: |
159 次 |
| 最近记录: |