首页 > 解决方案 > 如何通过管道从查找到解压缩到 grep

问题描述

find . -name "*.ooutline" -print0 | xargs -0 -n1 unzip -c | grep  -m 10 -Eo ".{0,20}$1.{0,20}" 

“.ooutline”文件是压缩的 OmniOutliner 文件。我想找到它们,包括递归地在子目录中;通过管道将名称解压缩;将每个 .ooutline 文件解压缩到内存中;然后在内存中 grep 解压缩文件的内容。

我没有太多的运气试图用 find 来做到这一点。我确实有一个可用的 bash shell 脚本,如下所示:

#!/bin/bash

for file in *.ooutline; do
    if ( unzip -c "$file" |   grep --label="$file" -H  -m 10 -Eo ".{0,20}$1.{0,20}"  )  ; then
        printf "\n\n"
    fi
done

我希望能够在一条线上用 find 做到这一点。我很感激对此的任何建议。谢谢你。

第二天

进步!这有效,但仅适用于列表中的文件之一。这意味着这个想法是正确的,但我有一些细节错误。注意:我从堆栈上的另一篇文章中得到了 find-exec-unzip 的想法:我确实有带空格的文件名。

find . -name '*.zip' -exec sh -c 'unzip -c -d "`dirname \"{}\"`" "{}"' ';' | grep  -m 10 -Eo ".{0,20}Peter.{0,20}"

我试过这个

find . -name '*.zip' -exec sh -c 'unzip -c  "{}"' ';' | grep  -m 10 -Eo ".{0,20}Peter.{0,20}"

它返回了这些结果

版本彼得睡着了,他们之所以把彼得带到这里是为了这个弥撒,阿德金斯博士发现彼得跪在重症监护室外祈祷。彼得确信五号还没有去那里。彼得给他演讲

...所以它肯定会从一个文件中返回一些东西(对科幻小说的分析)。

标签: bashgrepfindpipeunzip

解决方案


使用zipgrep你可以这样做:

find . -name '*.ooutline' -print0 | xargs -0 zipgrep -Ho '.{0,20}$1.{0,20}'

推荐阅读