在bashshell中查找命令和-name选项

在bashshell中查找命令和-name选项,bash,shell,scripting,find,Bash,Shell,Scripting,Find,以下两者之间的区别是什么: find . -type f -name \*.bmp find . -type f -name *.bmp 我已经测试过了,它们都返回了相同的结果,那么内部有什么不同吗 从中添加: 因此,为了避免特殊****字符的shell扩展,只将*作为参数传递给find命令,并让它处理它 但是在我的机器上,它们都很好,都返回当前目录下的bmp文件,举几个例子,结果如下,为了简洁起见,省略了一些 ./images/building_color.bmp ./images/bu

以下两者之间的区别是什么:

find . -type f -name \*.bmp
find . -type f -name *.bmp 
我已经测试过了,它们都返回了相同的结果,那么内部有什么不同吗


从中添加:

因此,为了避免特殊****字符的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
系统信息:

GNUBash,版本4.1.5(1)-发行版(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

当您转义星号(
\*
)时,星号本身作为参数传递给
find
命令,并由
find
进行计算。如果您没有转义星号(
*
),shell将对其进行计算并将其扩展为与模式匹配的文件名

考虑以下目录结构:

./a.txt
./b.bmp
./c.bmp
./dir/d.doc
./dir/e.bmp
当你执行

find . -type f -name *.bmp
外壳将
*.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
将在当前目录(
)及其所有子目录(仅在示例中为
dir
)中递归,并将在这些目录中查找与模式匹配的所有文件。结果将是:
b.bmp
c.bmp
,还有
dir/e.bmp
,以下是它们的不同之处:第一个始终有效,第二个则无效

至于原因:在bash中,shell glob(通配符模式包括*或?)由shell扩展到与glob匹配的所有文件中。但是,如果不存在这样的文件,则不考虑模式

因此,如果您所在的目录中没有
bmp
文件,那么命令的工作方式是相同的,因为第一个命令被转义,而bash在第二种情况下找不到任何匹配的文件

如果从仅包含一个此类文件的目录运行,例如
foo.bmp
,则第一个目录将在子树中查找所有
bmp
文件,而第二个目录将仅查找名为
foo.bmp
的所有文件。如果在包含多个
bmp
文件的目录中运行,我相信您会得到一个错误,因为
find
不知道如何处理所有文件名。

第一个命令:

find . -type f -name \*.bmp
将星号传递给
find
命令,该命令告诉它查找当前目录下以.bmp结尾的所有文件

第二个命令:

find . -type f -name *.bmp
可由外壳解决,例如:

find . -type f -name image1.bmp image2.bmp image3.bmp
(仅限当前目录中的bmp文件)


find
将只列出它们,而不是当前目录下其他目录中的bmp文件。

最好将其作为“find”运行-键入f-name“*.bmp”以避免shell扩展和目录错误。@cd1,@bmk为了避免特殊*字符的shell扩展,只将*作为参数传递给find命令,并让它处理它。但是在我的机器上,它们都很好,都返回当前目录下的bmp文件,举几个例子,结果如下,为了简洁起见,省略了一些。/images/building_color.bmp./images/building_gray.bmp./images/car_gray.bmp./images/temple_color.bmp./tools_gray.bmp./images/car_color.bmp./images/boat_color.bmp“但是,如果不存在这样的文件,则该模式将被单独保留。”位!