为什么在“find”中的星号前有反斜杠?

Ram*_*hum 9 bash find

在这个命令中:

find . -name \*.pyc -delete
Run Code Online (Sandbox Code Playgroud)

为什么之前需要反斜杠*.pyc

dev*_*ull 19

一个未加引号的 glob 会在find执行之前被shell 展开。(请参阅手册中的文件名扩展。)

所以说:

find . -name *.pyc -delete
Run Code Online (Sandbox Code Playgroud)

实际上会执行:

find . -name file1.pyc file2.pyc file3.pyc -delete
Run Code Online (Sandbox Code Playgroud)

假设当前目录中有 3 个 .pyc 文件并导致错误。

反斜杠使 shell 将 glob 传递给find,即它就像*.pyc被引用一样。

理想情况下,您应该引用一个全局变量:

find . -name '*.pyc' -delete
Run Code Online (Sandbox Code Playgroud)


slh*_*hck 5

在你的 shell 发出find命令之前,它会进行各种扩展。这样做时,它还处理特殊字符(或具有特殊含义的字符),其中*是通配符 \xe2\x80\x93\xc2\xa0a 通配符。这就是所谓的文件名扩展。

\n\n

假设您的目录中有两个文件:

\n\n
    \n
  • foo.pyc
  • \n
  • bar.pyc
  • \n
\n\n

然后*.pyc将扩展到两个名称。所以如果你写:

\n\n
find . -name *.pyc -delete\n
Run Code Online (Sandbox Code Playgroud)\n\n

那么 shell 实际上会调用:

\n\n
find . -name foo.pyc bar.pyc -delete\n
Run Code Online (Sandbox Code Playgroud)\n\n

这没有多大意义,因为你只能有一个论据-name。这就是为什么您需要转义特殊字符以防止它被 shell 解释。您可以通过反斜杠转义或引用它来做到这一点。

\n