我学习了如何在 find 命令中使用通配符,但今天我看到了一种奇怪的行为。
当我在搜索位置以外的任何地方时,我不需要单引号或双引号来进行通配符
$ pwd
/home
$ find / -name *c
...
it is ok
但
$ pwd
/
$ find / -name *c
find: paths must precede expression: proc
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
发生什么事?
答案1
当您使用不带引号(或未转义)的*
ie glob 标记*
(任意数量的字符,即任何文件)时,shell 将扩展*
到给定目录中的所有文件,如果是 ,则扩展*c
为以 结尾的所有文件c
。因此,当您运行:
find / -name *c
.c
假设当前目录中有三个文件,分别是foo.c
、bar.c
和spam.c
,则实际运行的命令是:
find / -name foo.c bar.c spam.c
这是一个无效的命令,正如您所见,它在单个-name
选项后使用了多个文件名。这就是您在 时发生的情况/
。
现在,在 时/home
,大概没有*c
文件存在,因此 glob 模式*c
将被保留(在 中bash
,这是依赖于 shell 的行为;在 中,您可以通过/ shell 选项bash
更改默认行为),因此命令得到的是:nullglob
failglob
find
find / -name *c
这是一个有效的命令并且有望运行。
现在,find
您应该引用或转义任何 shell 通配符,因为您想要find
解释(扩展)这些通配符,而不是由 shell 事先解释。因此请执行以下任一操作:
find / -name '*c'
find / -name "*c"
find / -name \*c