有谁知道为什么在 grep 命令中使用两个 * 不会返回任何内容。我原来的命令如下:
find | grep 0000\:00\:*.0/usb1/authorized_default
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我试图返回一个我不知道 PCI 文件夹名称的文件。此命令按预期完美运行(将 * 作为通配符)并确定 usb1 位于“1a”文件夹中。
如果我在命令中放置另一个通配符以将 'usb1' 替换为 'usb*',为什么 grep 不返回任何结果?我的最终目标是返回所有的authorized_default 文件,我意识到可以通过其他方式并且可能更有效地完成这些文件。然后我的问题就不是我该怎么做,但是当我将另一个“*”符号放入等式时,为什么 grep 不返回结果?
find | grep 0000\:00\:*.0/usb*/authorized_default
Run Code Online (Sandbox Code Playgroud)
提前感谢您的时间和回复。
grep
使用正则表达式,而不是shell globs。
正则表达式0000:00:*.0/usb1/authorized_default
匹配字符串0000:00
+ 零个或多个冒号 + 任何字符 + 0/usb1/authorized_default
。
如果交换*
和.
,它将匹配包含0000:00
后跟 的 任何字符串0/usb1/authorized_default
。(.*
匹配任意数字 ( *
) 的任意字符 ( .
)。)
同样,usb*/
将匹配us/
,usb/
,usbbb/
等,但没有usb1
。
实际上,还有一个问题是,*
在 to 参数中未引用的grep
内容被shell视为全局字符,grep
甚至在看到它之前。因此,如果存在匹配0000\:00\:*.0/usb*/authorized_default
为 glob 模式的文件,则会影响到grep
. 多个匹配将作为多个参数,并将grep
第一个作为文件名。
在命令行上的任何正则表达式周围加上引号以防止这种情况发生。
无论如何grep
,正如@Kusalananda 所说,您甚至不需要这里。该 -name
给的选项find
可以用来匹配的glob模式的文件名。至少某些find
实现还可以-regex
选择将文件名与正则表达式进行匹配。
还有许多正则表达式的变体,请参阅:为什么我的正则表达式在 X 中有效但在 Y 中无效?