下面的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/