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

Linux 为什么find-regex命令不同于find | grep?,linux,command-line,Linux,Command Line,下面的find命令不输出任何内容,也找不到任何“包含”文件或目录 find -regex "*include*" 2>/dev/null 然而,将find命令导入grep-E似乎可以找到大多数include文件 find ./ 2>/dev/null | grep -E "*include*" 我省略了输出,因为第一个是空的,第二个匹配了很多文件 我开始需要深入研究linux系统文件,以找到我需要的答案(特别是找到宏值)。为了做到这一点,我一直在使用find | grep-E

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

find  -regex "*include*" 2>/dev/null 
然而,将find命令导入grep-E似乎可以找到大多数include文件

find ./ 2>/dev/null | grep -E "*include*"
我省略了输出,因为第一个是空的,第二个匹配了很多文件

我开始需要深入研究linux系统文件,以找到我需要的答案(特别是找到宏值)。为了做到这一点,我一直在使用find | grep-E查找应该包含我要查找的宏的文件

下面是我今天用find尝试的一行(我的根目录是/),没有输出任何内容。我不想以root用户身份运行该命令,因此我将错误传递到/dev/null。我检查了regex语法错误,但什么都没有。它仍然在所有目录中循环,因为我仍然收到“find:/var/lib:Permission Denied”错误

然而,这似乎工作,并给我一切我想要的

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

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

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

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

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

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


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

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

你应该使用这个图书馆

yum install locate
如果你使用ubuntu

sudo apt-get install locate
准备图书馆

sudo updatedb
然后开始搜索

locate include 

“*include*”
不是有效的regexp,
“*include.*”
是。
find
与regex尝试匹配整个路径;看起来您希望文件和目录的名称中包含
include
。您可以使用
-name
进行以下操作:
查找-名称“*包括*”
;请注意,
-name
采用shell模式,而不是正则表达式作为其参数<模式中的代码>*与正则表达式中的代码>*相同。谢谢大家的输入,我从你们的建议中学到了很多!请将答案放在答案栏中。稍后,你可以接受自己的答案。再见,谢谢!我是一个vim用户,所以很高兴知道这一点。我不确定regexvim使用哪个版本,但我发现它与grep非常相似。你的答案解决了!Vim有自己独特的方言和一堆扩展,但是对于只有
*()|[]a-z
的简单模式,在没有
-E
的情况下,它的行为确实类似于
grep
,谢谢你提供了有用的linux二进制文件,我将来也会考虑使用它!
locate include