find 在命令行上给出模式时不递归

Oli*_*pin 9 bash find recursive quoting wildcards

想象一个源树。到处都有xml文件。

但是由于这棵树的根部有一个 XYZ.xml,它不会找到我的 xml 文件。

find -iname *.xml
Run Code Online (Sandbox Code Playgroud)

返回

./XYZ.xml
Run Code Online (Sandbox Code Playgroud)

代替

./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Run Code Online (Sandbox Code Playgroud)

cjm*_*cjm 19

find -iname '*.xml'
Run Code Online (Sandbox Code Playgroud)

否则,您的 shell 将扩展*.xmlXYZ.xml,而实际执行的命令是

find -iname XYZ.xml
Run Code Online (Sandbox Code Playgroud)

如果当前目录中没有 XML 文件,它起作用的原因是,如果通配符不匹配任何内容,shell 通常会保留未扩展的通配符。在一般情况下,你想通配符的任何时间比外壳以外的程序扩展(如通过findtarscp,等),你需要说出来了这样的外壳不会尝试扩展它们本身。

  • 这不是 bash 本身的“错误”,而是您没有引用您想作为参数传递的通配符。这适用于所有接受 shell 输入的程序。除非它们被引用或转义,否则 shell 会将它们扩展为 globs。 (3认同)

Cal*_*leb 6

你需要像这样引用你的论点:

find ./ -name '*.xml'
Run Code Online (Sandbox Code Playgroud)

以便它被传递给 find 而不是被 shell 扩展,然后作为扩展版本传递给 find。