代码适用于...较小的tar文件,但不是更大的?

时间:2014-06-06 13:17:01

标签: bash unix grep tar

所以我正在编写脚本来搜索tar文件中的特定字符串 - 基本上是zgrep。 出于某种原因,虽然它冻结了更大的文件......

有什么想法吗?

#!/bin/bash

tarname=$1
pattern=$2
max=$3

count=1
tar -tf  $tarname | while read -r FILE
do
    tar -xf  $tarname $FILE

    count=$(expr $count + 1)

    if [ "$count" == "$max" ]; then
        rm $FILE
        break
    fi

    if grep $pattern $FILE; then
        echo "found pattern in :" $FILE
        mv $FILE stringfind
    else
        rm $FILE
    fi

done
if [ $(ls stringfind | wc -l) -eq 0 ]; then
    echo "File Not Found"
fi

我需要这样做以减少空间限制 - 但为什么它不会经历其他文件?我做了一个循环打印输出测试,它只停止一次或两次才停止......

所以每当我调用“read”时,它都在读取整个tar文件? 如果tar有100个文件,它的读数是100x100 = 10,000倍?

3 个答案:

答案 0 :(得分:2)

您继续打开和关闭tarfile,每次从头开始读取它。如果可以的话,一次性提取所有文件会更加经济。

如果你不能,那么移植到支持tar文件库的语言将是我的建议。 https://docs.python.org/2/library/tarfile.html看起来像你需要的东西应该只用几行Python。

答案 1 :(得分:1)

  1. 您自己提取每个文件。
    • 如果没有“-n”参数,则tar认为该文件不可搜索
    • 这会导致tar从头开始读取整个存档,即使您只想处理最后一个文件
  2. 在提取最后一个(显然不需要的)文件
  3. 之前,你应该先增加计数并检查中断条件
  4. 由于你似乎没有评估找到的文件的内容,除了测试,如果文件“stringfind”存在,你可能会在找到第一个这样的文件后中断

答案 2 :(得分:1)

您正在从命令行读取每个文件,然后多次在该文件上运行tar -xf。这效率很低。只需提取整个tarball,然后使用grep -l -R(适用于大多数系统)来搜索包含字符串的文件。 -l表示列出文件名,并且不会在包含正则表达式的文件中给我这一行。

为什么选择小型而非大型?可能是这个逻辑:

if [ "$count" == "$max" ]; then
    rm $FILE
    break
fi

您计算在循环中的次数,并在您点击max时中断。如果max为100,则在包含1000个文件且字符串在第200个文件中的tar球上将失败。