查找和 ls 上的通配符



我正在尝试找出通配符来执行文件操作。

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

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) 手册页, 以了解内核如何运行程序)。

相关内容

  • 没有找到相关文章

最新更新