希望有人可以帮忙。
我有一系列 zip 文件。这些 zip 文件包含电子邮件文件 (.eml)。我需要查找两个人之间的所有文件。
我可以使用在这里找到的答案轻松找到其中一个
for z in 2013-*.zip ; do zipgrep "PATTERN" $z | sed "s/^/$z: /" ; done
它正在我正在努力寻找的已识别文件内的第二个名字。
我尝试对该文件进行第二次 grep 和 zip grep,但无济于事。
非常感谢您的帮助。
答案1
如果模式不一定在同一行,那么简单zipgrep
是无法做到的,您需要将其包装在一个小脚本中,以检查是否在同一个文件中找到这两个模式。尝试类似以下操作:
for z in 2013-*.zip ; do
zipgrep "pat1" $z >/dev/null &&
zipgrep "pat2" $z >/dev/null &&
echo $z;
done
这将搜索每个 zip 文件pat1
,如果找到(这就是 的意思&&
),它将搜索pat2
,如果也找到,它将打印文件的名称。我正在重定向标准输出(>/dev/null
),以便只打印文件名。如果您还想查看相关行,请执行以下操作:
for z in 2013-*.zip ; do
zipgrep "pat1" $z &&
zipgrep "pat2" $z &&
echo $z;
done
好的,这将打印 zip 文件以及 zip 文件中匹配文件的名称。它会创建一个临时目录 ( mktemp -d
),将每个 zip 文件解压到其中,然后删除该目录。如果您正在处理大文件,这将需要一段时间,但我认为没有任何方法可以避免它。
tmpdir=$(mktemp -d tmp.XXXXX); for z in 2013-*.zip ; do
zipgrep "pat1" $z >/dev/null && zipgrep "pat2" $z > /dev/null &&
unzip $z -d $tmpdir >/dev/null 2>&1;
for i in $tmpdir/*; do
grep "pat1" $i >/dev/null &&
grep "pat2" $i >/dev/null &&
echo "$z : $i" | sed "s/$tmpdir.//";
done;
done; rm -rf $tmpdir;