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

Posted

技术标签:

【中文标题】如何将 grep 生成的每个文件放入 zip 文件中【英文标题】:How put every files result by a grep into a zip file 【发布时间】:2022-01-12 18:42:30 【问题描述】:

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

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

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

谢谢

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

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

【问题讨论】:

【参考方案1】:

您可以使用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

【讨论】:

谢谢,这个命令会在每个文件夹中创建一个类似于 mytextfile.txt.zip 的 zip 文件,其中已在文件中找到“string1|string2”。我想在根文件夹(我在其中启动命令)中创建一个包含与我的 grep 匹配的每个文件的单个 zip。非常感谢 ok 使用这个命令对我有用 grep --null -rlE --include='*.txt' 'string1|string2' | xargs -0 -I zip test.zip '' 谢谢 创建单个 zip 使用 grep --null -rlE --include='*.txt' 'string1|string2' | xargs -0 zip test.zip 会更高效【参考方案2】:

因为您想要同时包含 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%)
$

【讨论】:

嗨 Vijayendar Gururaja,当我运行此脚本时,我收到此错误 xxxxxxxx:~/testzipemail$ ./testgrep.sh grep: *.txt: No such file or directory zip 错误:无事可做! (文件.zip) 添加了一个演示来回答。您需要确保 for 循环具有您的文本文件的路径。在演示中,我的 txt 文件位于 /SO/*.txt 下。您可以改为更新所需的路径。为了可移植性,您还可以将其转换为函数以接受路径和逗号分隔的字符串作为脚本参数,以便您可以像 ./script.sh /my/folder/path/*.txt string1,string2,stringX 一样运行它。 感谢 Vijayendar Gururaja 的回答,但我认为单行命令比 bash 脚本更好;-)

以上是关于如何将 grep 生成的每个文件放入 zip 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python zipfile 将文件放入 zip 存档中

如何将忽略的文件夹放入 GitHub 上的发布存档中?

使用 7zip 命令将目录中的文件归档到单个 zip [关闭]

如何将一个巨大的zip文件拆分成多个卷?

如何将 zip 文件的内容分配给 Spark 中的每个任务?

如何使用 Java 将每个文件存储在 zip 存档中的数组中?