我学会了如何在 find 命令中使用 globbing,但今天我看到了一个奇怪的行为。
当我在搜索位置以外的任何地方时,我不需要单引号或双引号来进行通配
$ 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]
发生什么事?
当您使用未引用(或未转义)
*
即 glob 令牌*
(任意数量的字符,即任何文件)时,shell 将扩展*
到给定目录中的所有文件,如果是*c
,则所有文件以c
. 所以当你运行时:.c
假设当前目录中有、 和三个文件foo.c
,实际运行的命令是:bar.c
spam.c
这是一个无效的命令,您可以看到它在单个
-name
选项后使用多个文件名。这就是您在/
.现在,虽然 at
/home
,可能没有文件存在,因此将保留*c
glob 模式(在 中,这是依赖于 shell 的行为;在 中,您可以通过/ shell 选项更改默认行为),因此得到的命令是:*c
bash
bash
nullglob
failglob
find
这是一个有效的命令,预计正在运行。
现在,
find
您应该引用或转义任何 shell 通配符,因为您想find
解释(扩展)它们,而不是事先由 shell。因此,请执行以下任何一项: