在 上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
不会匹配。
另请注意,在不引用和转义的情况下,如果模式不匹配(并且nullglob
和failglob
被禁用),则会将其视为按原样。例如,对于find . -name *net*
,如果当前目录中不包含文件名,则net
模式 find 得到的是*net*
。
因此,要解决该问题,您需要避免 shell 通配符,为此,您可以使用引用或转义通配符模式:
find . -name '*net*'
find . -name "*net*"
find . -name \*net\*