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}"
它返回了这些结果
版本Peter睡眠与饮水 他们把彼得带到这里来的原因 阿德金斯博士发现彼得屈膝 在ICU外面祈祷。彼得确信“五我还没有去那里”。 彼得给他演讲
...因此,它肯定是从一个文件返回的东西(对科幻小说的分析)。
答案 0 :(得分:1)
使用zipgrep
,您可以这样做:
find . -name '*.ooutline' -print0 | xargs -0 zipgrep -Ho '.{0,20}$1.{0,20}'
答案 1 :(得分:0)
尝试使用 GNU Parallel ,并并行使用所有可爱的Intel CPU内核:
find . -name \*.ooutline -print0 | parallel -0 --tag 'unzip -c {} | grep -Eo ".{0,20}"'
--tag
用文件名标记输出行。 {}
代表输入文件名。
答案 2 :(得分:0)
我相信您原来的find
命令可以正常工作,但是您忘了将其放在脚本文件中,说script.sh
,然后将字符串作为命令行参数传递了吗?这是我采取的步骤,请让我知道在哪里做出错误的假设:
已执行的命令:
echo Alice Bob Peter >'Alice Bob Peter.txt'
echo Alice Alice Alice >'Alice Alice Alice.txt'
echo Alice Peter Bob >'Alice Peter Bob.txt'
for f in 'Alice Bob Peter.txt' 'Alice Alice Alice.txt' 'Alice Peter Bob.txt';do zip "${f%txt}ooutline" "$f";done
echo 'find . -name "*.ooutline" -print0 | xargs -0 -n1 unzip -c | grep -m 10 -Eo ".{0,20}$1.{0,20}"' >script.sh
bash script.sh Peter
输出:
Archive: ./Alice Peter Bob.ooutline
extracting: Alice Peter Bob.txt
Alice Peter Bob
chive: ./Alice Bob Peter.ooutline
tracting: Alice Bob Peter.txt
Alice Bob Peter
答案 3 :(得分:0)
这听起来像是您只是问如何在unzip
找到的每个文件上调用find
,并将其输出通过管道传输到grep
。将unzip
替换为cat
进行演示:
$ cat file
Wee, sleekit,
cowrin', tim'rous beastie,
Oh whit a panic's
in thy breastie
$ find . -maxdepth 1 -name file -exec sh -c 'cat "{}" | grep "whit"' \;
Oh whit a panic's
$ find . -maxdepth 1 -name file -exec cat "{}" \; | grep "whit"
Oh whit a panic's
$ find . -maxdepth 1 -name file -print0 | xargs -0 -I {} sh -c 'cat {} | grep "whit"'
Oh whit a panic's
$ find . -maxdepth 1 -name file -print0 | xargs -0 cat | grep "whit"
Oh whit a panic's
这两个怎么了?我可以看到您尝试了类似的方法,并且您似乎在说它们有问题,但是您没有提供示例输入或预期输出,因此我们无法确定问题出在哪里。尝试使用带有cat
的纯文本文件,而不是要求带解压缩的zip文件,这样您就可以在问题中显示[mcve]。