为什么 find 前面有星号(*)时不列出匹配的文件?

Hol*_*ock 4 shell find quoting wildcards

在 上Ubuntu 14.04, 64 bit,我已设置/lib/modules/4.2.0-27-generic/kernel/drivers为我的当前目录。我打算搜索所有net作为子字符串存在的文件。如果我使用 的正则表达式进行搜索,则*net*./net返回目录作为搜索结果。但是,如果我指定确切的文件名,那么它只会列出相关的文件(没用,因为我并不总是知道要交叉检查的确切文件名)。

$ find . -name *net* 
./net
$ find . -name *usbnet* 
./net/usb/usbnet.ko
$ pwd
/lib/modules/4.2.0-27-generic/kernel/drivers
Run Code Online (Sandbox Code Playgroud)

我犯了什么错误?

hee*_*ayl 10

因为当您使用 just *net*(没有任何引用或转义)时,它会netfind命令运行之前被 shell 扩展为当前目录中的(现有)文件/目录。所以命令变成:

find . -name net
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它只是匹配net,所以usbnet.ko不会被匹配。

另请注意,在不引用和转义的情况下,如果模式不匹配(并且nullglobfailglob选项被禁用),则将其视为is。因此,例如,对于find . -name *net*,如果net当前目录中不包含文件名,则模式 find 获取的是*net*


所以要解决这个问题,你需要避免 shell globbing,为此你可以使用引用或转义 glob 模式:

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 
Run Code Online (Sandbox Code Playgroud)

  • 另一点是,当模式不*不*匹配时,bash不会*不*删除任何通配符,并且`find`获取带有星号的参数`*usbnet*` (2认同)