我正在尝试找出通配符来执行文件操作。
我将这些文件放在目录中以进行测试:
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文件,对吧?
find -name *{.GIF,.gif}
是错误的。
此命令首先由命令行管理程序扩展为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 -iname '*.gif'
请注意此处的单引号 ( '
)。这意味着*.GIF
应该按原样发送查找,而无需任何外壳扩展。并找到将以此作为模式。此单引号是必需的,除非您转义 shell 元字符。在这种情况下,命令将如下所示
find -iname *.gif
您在使用参数 -iname
find
时遇到问题,因为您必须引用您提供给它的模式。
因此,您应该执行以下操作:
find -iname '*.gif'
这在手册中有所说明:
"...请注意,你应该理所当然地引用模式,否则 shell 会扩展其中的任何通配符。
您应该了解(与Windows相反)shell在将*{.GIF,.gif}
传递给find
程序之前对其进行扩展。
您可以通过将程序替换为 echo
来感受 shell 的作用。
所以你应该引用程序参数,比如
echo -name '*{.GIF,.gif}'
所以运行
find -name '*.{GIF,gif}'
也许你想要
find -name '*.gif' -o -name '*.GIF'
请阅读 高级 Bash 脚本指南 (也许还有 execve(2) 手册页, 以了解内核如何运行程序)。