有谁知道为什么在 grep 命令中使用两个 * 不会返回任何内容。我原来的命令如下:
find | grep 0000\:00\:*.0/usb1/authorized_default
在此示例中,我尝试返回一个我不知道 PCI 文件夹名称的文件。该命令完美运行并符合预期(将 * 作为通配符)并确定 usb1 位于“1a”文件夹中。
如果我在命令中放置另一个通配符以将“usb1”替换为“usb*”,为什么 grep 不返回任何结果?我的最终目标是返回所有的authorized_default文件,我意识到这些文件可以通过其他方式完成,并且可能更有效。然后我的问题不是如何做到这一点,而是为什么当我将另一个“*”符号放入方程时 grep 不返回结果?
find | grep 0000\:00\:*.0/usb*/authorized_default
预先感谢您的时间和回复。
答案1
正则表达式0000:00:*.0/usb1/authorized_default
匹配字符串0000:00
+ 零个或多个冒号 + 任何字符 + 0/usb1/authorized_default
。
如果交换*
和.
,它将匹配任何包含0000:00
后跟 的 字符串0/usb1/authorized_default
。 (.*
匹配任何*
字符()的任何数字(.
)。)
同样,usb*/
将匹配us/
,usb/
等usbbb/
,但不匹配usb1
。
实际上,还存在一个问题,即*
参数中未加引号的部分被grep
视为全局字符通过外壳,grep
甚至在看到它之前。因此,如果存在可以0000\:00\:*.0/usb*/authorized_default
作为 glob 模式匹配的文件,则会影响转到grep
.多个匹配将作为多个参数,并将grep
第一个匹配之后的参数作为文件名。
在命令行上的任何正则表达式周围加上引号以防止这种情况发生。
无论如何,grep
正如 @Kusalananda 所说,你甚至不需要这里。选项 -name
可find
用于将文件名与全局模式进行匹配。至少某些find
实现还可以-regex
选择将文件名与正则表达式进行匹配。
正则表达式还有许多变体,请参阅:为什么我的正则表达式在 X 中有效但在 Y 中无效?
答案2
正如 ilkkachu 已经指出的那样,grep
使用基本正则表达式,这意味着:*
匹配零个或多个:
,并且b*
匹配零个或多个b
。
不要grep
输出find
,而是使用find
来查找您的文件。在一般情况下,文件名可能包含换行符,这将使 grep 不起作用。使用find
直接过滤想要查看的路径名也更高效、更安全。
find . -type f -name 'authorized_default'
如果您必须对路径名的其他部分进行匹配:
find . -type f -path '*0000:00:*.0/usb*/authorized_default'
-path
工作方式类似于-name
但匹配整个路径的文件名通配模式,而不是仅匹配路径名的文件名部分( a*
可以匹配一个或多个/
)。
有关的: