匹配不带引号的名称时的 find 命令行为

spr*_*gr8 3 linux bash find

我正在寻找find带双引号和不带引号的命令的差异。

我发现了一些奇怪的东西。我有两个文件:

  • xWrapper.java
  • YWrapper.java

和一些在模式中*Wrapper.java

我跑了

find . -name *Wrapper.java
Run Code Online (Sandbox Code Playgroud)

它应该返回匹配模式的第一个文件,因为命令扩展为

find . -name xWrapper.java yWrapper.java ..
Run Code Online (Sandbox Code Playgroud)

但结果,我得到了该表格的所有文件。为什么它返回与该模式匹配的所有文件?

Dan*_*son 7

如果您在同一目录中,则应该收到错误消息:

~$ mkdir test
~$ cd test
~/test$ touch {X,Y}Wrapper.java
~/test$ find . -name *Wrapper.java
find: paths must precede expression: YWrapper.java
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
Run Code Online (Sandbox Code Playgroud)

因为星号将被扩展,并且-name只接受一个参数。

如果您来自未扩展星号的位置:

~/test$ cd ..
~$ find test -name *Wrapper.java
test/XWrapper.java
test/YWrapper.java
Run Code Online (Sandbox Code Playgroud)

由于星号现在没有扩展(只要它与当前目录中的任何内容都不匹配),find“按原样”查看它,并将其用作通配符。

您应该将-name参数用单引号括起来,以避免这种依赖于上下文的行为:

~/test$ find . -name '*Wrapper.java'
./XWrapper.java
./YWrapper.java
Run Code Online (Sandbox Code Playgroud)