为什么我可以找到 *main.o 但不能找到 *.o?

The*_*ent 19 command-line find

这个是对的:

$ find . -name *main.o
./main.o
Run Code Online (Sandbox Code Playgroud)

那么,为什么我找不到*.o

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Run Code Online (Sandbox Code Playgroud)

Let*_*ety 46

可能有多个文件匹配*.o,而只有一个文件匹配*main.o,因此,在第一种情况下,shell 扩展运行:

$ find . -name main.o
Run Code Online (Sandbox Code Playgroud)

这有效。在第二种情况下:

$ find . -name file1.o main.o
Run Code Online (Sandbox Code Playgroud)

这就是你出错的原因。

为了防止这种情况,您应该expression在两个命令中引用:

$ find . -name '*.o'
$ find . -name '*main.o'
Run Code Online (Sandbox Code Playgroud)

  • 实际上,可以使用 `echo *.o` 和 `echo '*.o'` 轻松检查这一点。 (2认同)

Ste*_*ein 16

将文件模式放在引号中。否则,* 被 shell 展开(在 find 看到它之前解析为文件列表),混淆 find。

find . -name "*.o"
Run Code Online (Sandbox Code Playgroud)

  • 或者用反斜杠转义 `*`:`find -name \*.o` (13认同)