查找和ls上的外卡

时间:2012-11-16 20:18:24

标签: linux bash

我正在试图找出用于执行文件操作的通配符。

我将这些文件放在目录中以进行测试:

file_BSD.GIF  file_linux.gif  file_unix

参见我的ls命令,

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

哪个好。

但“发现”似乎没有同样的方式:

$ 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文件,对吧?)。

3 个答案:

答案 0 :(得分:44)

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'

相同
find -iname '*.gif'

请注意这里的单引号(')。这意味着应该发送*.GIF以查找,而不进行任何shell扩展。。并且find会将其用作模式。除非您转义shell元字符,否则此单引号是必需的。在这种情况下,命令看起来像

find -iname \*.gif

答案 1 :(得分:10)

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

所以,你应该这样做:

find -iname '*.gif'

手册中说明了这一点:

  

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

答案 2 :(得分:3)

你应该明白(与Windows不同)shell在将*{.GIF,.gif}传递给find程序之前正在扩展它。

您可以通过使用echo替换程序来了解shell的功能。

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

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

所以运行

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

也许你想要

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

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