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

时间:2019-04-17 21:42:40

标签: linux command-line

下面的find命令不会输出任何内容,也不会找到任何“包含”文件或目录。

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

但是,将find命令传递给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吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

据我所知,您想在Linux目录中查找文件

您应该使用该库

yum install locate

如果您使用ubuntu

sudo apt-get install locate

准备库

sudo updatedb

然后开始搜索

locate include