所以我正在编写脚本来搜索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倍?
答案 0 :(得分:2)
您继续打开和关闭tarfile,每次从头开始读取它。如果可以的话,一次性提取所有文件会更加经济。
如果你不能,那么移植到支持tar
文件库的语言将是我的建议。 https://docs.python.org/2/library/tarfile.html看起来像你需要的东西应该只用几行Python。
答案 1 :(得分:1)
答案 2 :(得分:1)
您正在从命令行读取每个文件,然后多次在该文件上运行tar -xf
。这效率很低。只需提取整个tarball,然后使用grep -l -R
(适用于大多数系统)来搜索包含字符串的文件。 -l
表示列出文件名,并且不会在包含正则表达式的文件中给我这一行。
为什么选择小型而非大型?可能是这个逻辑:
if [ "$count" == "$max" ]; then
rm $FILE
break
fi
您计算在循环中的次数,并在您点击max
时中断。如果max
为100,则在包含1000个文件且字符串在第200个文件中的tar球上将失败。