如何将 grep 生成的每个文件放入 zip 文件中

How put every files result by a grep into a zip file

我正在搜索包含 string1 和 string2 的每个 txt 文件

grep -rnE --include='*.txt' 'string1|string2'

现在我想将所有这些文件放入一个 zip 文件中。

谢谢

编辑 @anubhava 建议的这个脚本对我有用

grep --null -rlE --include='*.txt' 'string1|string2' | xargs -0 -I {} zip test.zip '{}'

您可以在 grep 中使用 -l 选项仅输出文件名并将其通过管道传输到 xargs 以创建 zip 为每个找到的罚款:

grep --null -rlE --include='*.txt' 'string1|string2' |
xargs -0 -I {} zip '{}'.zip '{}'

注意在 xargs 中使用 --null 选项和 -0 来处理带有空格、特殊字符的文件名。


要创建包含每个匹配文件的单个 zip 文件,请使用:

grep --null -rlE --include='*.txt' 'string1|string2' |
xargs -0 zip test.zip

因为您想要同时包含 string1 string2

的文件
$ files=""; for i in *.txt; do if  grep -q string1 $i &&  grep -q string2 $i; then files="$files $i"; fi; done
$ zip files.zip ${files}

清洁版

files=""; 
for i in *.txt; 
  do 
    if  grep -q string1 $i &&  grep -q string2 $i; then 
      files="$files $i"; 
    fi; 
  done
zip files.zip ${files}

演示:

$ cat SO/file1.txt
there is string1
there is also string2
$
$ cat SO/file2.txt
there is just string1
$
$ cat SO/file3.txt
here we have both string1 and string2
$
$
$ files="";
$ for i in SO/*.txt;
>   do
>     if  grep -q string1 $i &&  grep -q string2 $i; then
>       files="$files $i";
>     fi;
>   done
$ zip files.zip ${files}
  adding: SO/file1.txt (deflated 26%)
  adding: SO/file3.txt (deflated 11%)
$