下面的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。我检查了正则表达式语法错误的错误,但一无所获。它仍然循环遍历所有目录,因为我仍然遇到“ find:/ var / lib:Permission Denied”错误

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后跟零个或多个e。 (POSIX表示前导星号is undefined的行为)。
find使用Emacs Regex,并将其解释为\*includ(e)*,因此在文件名中需要文字星号。


如果要从两者获得相同的结果,则可以使用find -regextype posix-egrep,也可以指定在两者中都等效的正则表达式(例如.*include.*)来匹配include作为子字符串。

关于linux - 为什么find -regex命令不同于find | grep?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55736388/

10-15 04:00