在bash shell中查找命令,并且-name选项有疑问

Tra*_*acy 3 bash shell scripting find

下面两者有什么区别:

find . -type f -name \*.bmp
find . -type f -name *.bmp 
Run Code Online (Sandbox Code Playgroud)

我测试过,它们都返回相同的结果,所以有什么不同_deep inside_吗?


删除的答案中添加:

因此,为了避免特殊*****字符的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
Run Code Online (Sandbox Code Playgroud)

系统信息:

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

Wal*_*ndt 7

以下是它们的不同之处:第一个始终有效,第二个无效.

至于原因:在bash中,shell globs(包括*或?的通配符模式)由shell扩展为与glob匹配的所有文件.但是,如果不存在此类文件,则保留该模式.

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

如果你从只包含一个这样的文件的目录中运行它,比如说foo.bmp,第一个会找到bmp子树中的所有文件,而第二个会找到所有foo.bmp只命名的文件.如果在包含多个bmp文件的目录中运行,我相信您会收到错误,因为find不知道如何处理所有文件名.