在此命令中:
find . -name \*.pyc -delete
为什么前面需要一个反斜杠*.pyc
?
答案1
find
未加引号的 glob 将在执行前被 shell 展开。(请参阅文件名扩展在手册中。
俗话说:
find . -name *.pyc -delete
实际上会执行:
find . -name file1.pyc file2.pyc file3.pyc -delete
假设当前目录中有 3 个 .pyc 文件,但结果却出现错误。
反斜杠使 shell 将 glob 传递给find
,即,它就像*.pyc
被引用一样。
理想情况下,你应该引用一个 glob:
find . -name '*.pyc' -delete
答案2
在 shell 发出find
命令之前,它会执行各种操作扩展。这样做时,它还会处理特殊字符(或具有特殊含义的字符),其中*
是通配符 - 通配符。这就是所谓的文件名扩展。
假设你的目录中有两个文件:
foo.pyc
bar.pyc
然后*.pyc
会扩展为两个名称。因此,如果你写:
find . -name *.pyc -delete
那么 shell 实际上会调用:
find . -name foo.pyc bar.pyc -delete
这没什么意义,因为 只能有一个参数-name
。这就是为什么你需要转义特殊字符以防止它被 shell 解释的原因。你可以使用反斜杠转义,或者用引号引起来。