37

我试图找出通配符来进行文件操作。

我在一个目录中有这些文件用于测试目的:

file_BSD.GIF  file_linux.gif  file_unix

看我的 ls 命令,

$ ls *{.GIF,.gif}
file_BSD.GIF  file_linux.gif

这没关系。

但是“find”的工作方式似乎不同:

$ find -name *{.GIF,.gif}
find: paths must precede expression: file_linux.gif
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

顺便说一句,我读过“-iname”应该同时定位大写和小写文件,但这似乎也不起作用:

$find -iname *.gif

./file_linux.gif

(这也应该找到 .GIF 文件,对吧?)。

4

3 回答 3

57

find -name *{.GIF,.gif}是错的。

该命令首先由 shell 扩展为find -name *.GIF *.gif

然后进一步扩展为:

find -name file_BSD.GIF  file_linux.gif 
# as you have only these files in directory

现在这-name file_BSD.GIF file_linux.gif被传递给find. 这是错误file_linux.gif的,因为find 不接受这样的开关。

你需要的是这个命令。

find -name '*.GIF' -or -name '*.gif'

假设您想以.gif不区分大小写的方式收集文件,此 find 命令变为,

find -iname '*.gif'

请注意此处的单引号 ( ')。这意味着*.GIF应该按原样发送查找,无需任何外壳扩展。find 将使用它作为模式。除非您转义 shell 元字符,否则此单引号是必需的。在这种情况下,命令看起来像

find -iname \*.gif
于 2012-11-16T20:26:20.823 回答
12

-iname您在使用参数时遇到问题,find因为您必须引用您给它的模式。

所以,你应该这样做:

find -iname '*.gif'

这在手册中有说明:

“...请注意,您应该理所当然地引用模式,否则shell将扩展其中的任何通配符。”

于 2012-11-16T20:28:05.183 回答
4

您应该了解(与 Windows 相比)shell*{.GIF,.gif}在将其传递给find程序之前会对其进行扩展。

您可以通过将程序替换为echo.

所以你应该引用程序参数,比如

   echo \-name '*{.GIF,.gif}'

所以跑

   find -name '*.{GIF,gif}'

也许你想要

   find -name '*.gif' -o -name '*.GIF'

请阅读Advanced Bash Scripting Guide(也许还有execve(2)手册页,以了解内核如何运行程序)。

于 2012-11-16T20:28:30.653 回答