想象一下一个源代码树。到处都有xml文件。
但是,由于在该树的根目录下有一个XYZ.xml,因此找不到我的xml文件。
find -iname *.xml
退货
./XYZ.xml
代替
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
想象一下一个源代码树。到处都有xml文件。
但是,由于在该树的根目录下有一个XYZ.xml,因此找不到我的xml文件。
find -iname *.xml
退货
./XYZ.xml
代替
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Answers:
find -iname '*.xml'
否则,您的外壳将扩展*.xml
为XYZ.xml
,并且实际执行的命令是
find -iname XYZ.xml
如果当前目录中没有XML文件,那么它起作用的原因是,如果外壳程序不匹配任何内容,它们通常会使通配符不展开。在一般情况下,你想通配符的任何时间比外壳以外的程序扩展(如通过find
,tar
,scp
,等),你需要说出来了这样的外壳不会尝试扩展它们本身。
bash
,而不是的问题find
。
通配符由外壳而不是命令扩展。find
是在自己的时间内执行类似于shell的通配符匹配的少数命令之一。
当您运行时ls *.xml
,外壳程序首先扩展*.xml
到匹配文件的列表,例如file1.xml
file2.xml
file3.xml
,然后外壳程序ls
使用结果的参数列表进行调用file1.xml
file2.xml
file3.xml
。这就是为什么您会看到与相同的文件名列表的原因echo *.xml
,即使echo
对文件一无所知,也不在乎其参数是否为文件名。
运行时find . -name "*.xml"
:
find
,.
,-name
,*.xml
其中*
被引用。自从*
引用起,就外壳而言,它是一个普通字符。find
与参数的指定列表:.
,-name
,*.xml
。find
*.xml
在当前目录下的任何目录中查找名称与模式匹配的文件。运行时find . -name *.xml
没有匹配的文件*.xml
:
find
,.
,-name
,*.xml
在*
没有加引号。*.xml
包含未加引号的通配符,因此外壳程序将执行文件名生成。由于没有匹配的文件名,因此模式不会扩展。find
与所得的参数列表,其是.
,-name
,*.xml
。find
*.xml
在当前目录下的任何目录中查找名称与模式匹配的文件。当您运行find . -name *.xml
和当前目录包含file1.xml
,file2.xml
以及file3.xml
:
find
,.
,-name
,*.xml
在*
没有加引号。*.xml
包含未加引号的通配符,因此外壳程序执行文件名生成:*.xml
由匹配文件名列表代替。find
与所得的参数列表,其是.
,-name
,file1.xml
,file2.xml
,file3.xml
。find
到达时抱怨语法错误file2.xml
。当您运行find . -name *.xml
并且当前目录包含单个匹配文件时file.xml
:
find
,.
,-name
,*.xml
在*
没有加引号。*.xml
包含未加引号的通配符,因此外壳程序执行文件名生成:*.xml
由匹配文件名列表代替。find
与所得的参数列表,其是.
,-name
,file.xml
。find
可以看到一个完全有效的命令,但它可能不是您想要的:find
被告知要查找file.xml
任何目录中调用的文件,而不要查找任何与匹配的文件*.xml
。(Shell评估和扩展还具有许多其他功能。我只在这里提到了相关的功能。)
(我描述的是大多数常见shell的默认行为:sh,bash,dash,ksh等。。。可以将某些shell配置为显示错误,而不是运行带有未扩展通配符的命令,或者将不匹配的通配符扩展为空列表。这些都对这里没有帮助。)
请试试:
find ./ -name *.xml
*
应始终引用或转义通过它找到。
man find
:请注意,您当然应该引用模式,否则shell会在其中扩展任何通配符。