将 find 与 sh - 命令一起使用不起作用

将 find 与 sh - 命令一起使用不起作用

我正在尝试搜索具有 pattern 的文件FW。我试图从这些过滤的文件中搜索模式chmod.*archive|archive.*chmod,然后列出它们。

我尝试使用以下命令,但它没有给我所需的输出。需要帮助来解决这个问题。

find . -name '*FW*' -exec sh -c "cat {}|grep -iEq 'chmod.*archive|archive.*chmod'|ls" \;|more

答案1

如果我理解正确的话,你所需要的只是:

find . -type f -name '*FW*' -exec grep -iEq 'chmod.*archive|archive.*chmod' {} \; -ls

这将为grep找到的每个文件中的模式提供帮助find,如果grep成功,将以类似于 的格式列出该文件ls -l

答案2

作为 @terdon 建议的替代方案,您也可以使用以下命令:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep FW

编辑

正如@Kusalananda 指出的:

如果您的文件位于名称中包含 FW 的目录中,则此操作将会失败(给出错误的输出)。

调整它以使其正常工作会使其可读性大大降低。 @terdon 提出的解决方案是一个更有利的选择(也更有效 - 请参阅@tedron 的评论)。

不过,这里有一个更正的版本:

grep -iErl 'chmod.*archive|archive.*chmod' . | grep -E '[^/]*FW[^/]*$'

答案3

您有两个选项来获取与包含与您的模式匹配的行的文件相对应的路径名:

  1. find输出路径名:

    find . -name '*FW*' -type f \
        -exec grep -q -i -e 'chmod.*archive' -e 'archive.*chmod' {} \; -print
    

    这会grep单独在每个找到的文件上运行,然后打印包含模式匹配项的每个文件的路径名(顺便说一句,我将其转换为一组符合标准的两个单独的基本正则表达式,因为答案中的其他所有内容是标准的)。

    -exec如果您想对路径名执行其他操作而不仅仅是在终端中打印它们(只需添加更多操作),这可能是您想要使用的。

  2. grep输出路径名:

    find . -name '*FW*' -type f \
        -exec grep -l -i -e 'chmod.*archive' -e 'archive.*chmod' {} +
    

    grep在批量找到的文件上运行。该实用程序将根据其(“dash-ell”)选项grep报告每个匹配文件的路径名。-l

    这可能会运行得更快,因为它最大限度地减少了调用次数grep,如果您只想在路径名处。

相关内容