我正在试图找出用于执行文件操作的通配符。
我将这些文件放在目录中以进行测试:
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文件,对吧?)。
答案 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)手册页,了解内核如何运行程序。)