/dev/null 但是,将 find 命令通过管道传输到 g-6ren">
gpt4 book ai didi

linux - 为什么 find -regex 命令与 find | 不同格雷普?

转载 作者:太空宇宙 更新时间:2023-11-04 05:10:41 25 4
gpt4 key购买 nike

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

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:权限被拒绝”错误

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 | 不同格雷普?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55736388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com