【问题标题】:How put every files result by a grep into a zip file如何将 grep 生成的每个文件放入 zip 文件中
【发布时间】: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 '{}'

【问题讨论】:

    标签: linux grep 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 脚本更好;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多