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

时间:2011-04-15 05:02:56

标签: bash shell scripting find

以下两者之间有什么区别:

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

3 个答案:

答案 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.bmpc.bmp但不会找到dir/e.bmp

执行时

find . -type f -name \*.bmp

*.bmp直接传递给findfind将递归当前目录(.)及其所有子目录(仅在示例中为dir),并将查找与该模式匹配的那些目录中的所有文件。结果将是:b.bmpc.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文件。