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

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

在 上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

我犯了什么错误?

答案1

因为当您使用 just *net*(不带任何引用或转义)时,shell 将在命令运行net之前将其扩展为当前目录中的(现有)文件/目录find。所以命令变成:

find . -name net

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

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


因此,要解决该问题,您需要避免 shell 通配符,为此,您可以使用引用或转义通配符模式:

find . -name '*net*' 
find . -name "*net*" 
find . -name \*net\* 

相关内容