以下两者之间有什么区别:
find . -type f -name \*.bmp
find . -type f -name *.bmp
我已经测试过,它们都会返回相同的结果,所以有不同的_deep inside_
吗?
从removed answer添加:
因此,为了避免特殊*****字符的shell扩展,只需将*作为参数传递给find命令并让它处理它。
但是在我的机器上,它们都很好,都返回当前目录中和下面的bmp文件,仅举几例,结果如下,为简洁省略了一些
./images/building_color.bmp
./images/building_gray.bmp
./images/car_gray.bmp
./images/temple_color.bmp
./images/boat_gray.bmp
./images/tools_gray.bmp
./images/temple_gray.bmp
./images/tools_color.bmp
./images/car_color.bmp
./images/boat_color.bmp
系统信息:
GNU bash,版本4.1.5(1)-release(i486-pc-linux-gnu)
Linux sysabod-laptop 2.6.32-30-generic#59-Ubuntu SMP Tue Mar 1 21:30:21 UTC 2011 i686 GNU / Linux
答案 0 :(得分:7)
以下是它们的不同之处:第一个总是有效,第二个没有。
至于为什么:在bash中,shell globs(包括*或?的通配符模式)由shell扩展为与glob匹配的所有文件。但是,如果不存在此类文件,则不会单独使用该模式。
因此,如果你在一个没有bmp
个文件的目录中,这些命令的工作方式是相同的,因为第一个是转义的,而bash在第二种情况下找不到匹配的文件。
如果从仅包含一个此类文件的目录(例如foo.bmp
)运行它,第一个将在子树中找到所有bmp
个文件,而第二个将找到名为{{1}的所有文件} 只要。如果在包含多个foo.bmp
文件的目录中运行,我相信您会收到错误,因为bmp
不知道如何处理所有文件名。
答案 1 :(得分:3)
当您转义星号(\*
)时,星号本身作为参数传递给find
命令,并由find
进行评估。如果你没有转义星号(*
),那么shell会对它进行评估并将其扩展为与模式匹配的文件名。
前面的例子考虑以下目录结构:
./a.txt
./b.bmp
./c.bmp
./dir/d.doc
./dir/e.bmp
执行时
find . -type f -name *.bmp
shell将*.bmp
扩展为b.bmp c.bmp
。即实际执行的命令是:
find . -type f -name b.bmp c.bmp
会找到b.bmp
和c.bmp
但不会找到dir/e.bmp
。
执行时
find . -type f -name \*.bmp
*.bmp
直接传递给find
。 find
将递归当前目录(.
)及其所有子目录(仅在示例中为dir
),并将查找与该模式匹配的那些目录中的所有文件。结果将是:b.bmp
,c.bmp
以及dir/e.bmp
。
答案 2 :(得分:2)
第一个命令:
find . -type f -name \*.bmp
将星号传递给find
命令,并告诉它找到以.bmp 结尾的当前目录中和下面的所有文件。
第二个命令:
find . -type f -name *.bmp
shell可以解析,例如:
find . -type f -name image1.bmp image2.bmp image3.bmp
(那将是当前目录中的bmp文件)
和find
只列出它们,不是当前下面的其他目录中的bmp文件。