find 命令中出现的奇怪行为

find 命令中出现的奇怪行为

通配符是 shell 的一个特性吗?

我学习了如何在 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.cbar.cspam.c,则实际运行的命令是:

 find / -name foo.c bar.c spam.c

这是一个无效的命令,正如您所见,它在单个-name选项后使用了多个文件名。这就是您在 时发生的情况/

现在,在 时/home,大概没有*c文件存在,因此 glob 模式*c将被保留(在 中bash,这是依赖于 shell 的行为;在 中,您可以通过/ shell 选项bash更改默认行为),因此命令得到的是:nullglobfailglobfind

 find / -name *c

这是一个有效的命令并且有望运行。


现在,find您应该引用或转义任何 shell 通配符,因为您想要find解释(扩展)这些通配符,而不是由 shell 事先解释。因此请执行以下任一操作:

find / -name '*c'
find / -name "*c"
find / -name \*c

相关内容