为什么 find -regex 命令与 find | grep 不同?



下面的 find 命令不输出任何内容,也找不到任何"include"文件或目录。

find  -regex "*include*" 2>/dev/null 

但是,将查找命令管道到 grep -E 中似乎可以找到大多数包含文件。

find ./ 2>/dev/null | grep -E "*include*"

我省略了输出,因为第一个是空白的,第二个匹配很多文件。

我开始需要挖掘 linux 系统文件以找到我需要的答案(尤其是查找宏值)。为了做到这一点,我一直在使用 find |grep -E 查找应该具有我正在寻找的宏的文件。

下面是我今天尝试使用 find 的行(我的根目录是/),没有任何输出。我不想以 root 身份运行该命令,所以我将错误通过管道传输到/dev/null。我检查了正则表达式语法错误的错误,但没有检查。它仍在遍历所有目录,因为我仍然收到"查找:/var/lib:权限被拒绝"错误

find  -regex "*include*" 2>/dev/null 

然而,这似乎有效并给了我想要的一切。

find ./ 2>/dev/null | grep -E "*include*"

所以我的主要问题是为什么 find -regex 的输出与 find | grep -E 不同?

正则表达式不是一种语言,而是一种具有许多不同的符号和方言的一般数学结构。

对于简单的模式,您通常可以忽略这一事实,因为大多数方言使用非常相似的符号,但是由于您指定了一个带有前导星号的定义不明确的模式,因此您进入了特定于引擎的行为。

  • grep -E使用 POSIX ERE 的 GNU 实现,并将您的模式解释为()*includ(e)*,因此匹配后跟includ零个或多个es(POSIX 表示前导星号的行为是未定义的)。

  • find使用 Emacs Regex,并将其解释为*includ(e)*,因此需要在文件名中使用文字星号。

如果您希望两者得到相同的结果,则可以使用find -regextype posix-egrep,也可以指定一个在两者中等效的正则表达式,例如.*include.*以匹配include作为子字符串。

据我了解您的问题,您想在 Linux 目录中查找文件

你应该使用此库

yum install locate

如果你使用 ubuntu

sudo apt-get install locate

准备库

sudo updatedb

然后开始搜索

locate include 

最新更新