将大型压缩日志文件拆分为X行的压缩块,同时进行内联压缩
我的情况如下:一个大的(10GB)压缩文件,其中包含一些文件(〜60),总未压缩大小为150GB。将大型压缩日志文件拆分为X行的压缩块,同时进行内联压缩
我希望能够将大型压缩日志文件分割成部分,其中包含一定数量的行(即:100万)。
我不希望,因为它涉及完全解压缩原始文件使用分裂,我也没有那么多的可用磁盘空间。
我在做什么,到目前为止是这样的:
#!/bin/bash
SAVED_IFS=$IFS
IFS=$(echo -en "\n\b")
for file in `ls *.rar`
do
echo Reading file: $file
touch $file.chunk.uncompressed
COUNTER=0
CHUNK_COUNTER=$((10#000))
unrar p $file while read line;
do
echo "$line" >> $file.chunk.uncompressed
let COUNTER+=1
if [ $COUNTER -eq 1000000 ]; then
CHUNK_COUNTER=`printf "%03d" $CHUNK_COUNTER;`
echo Enough lines \($COUNTER\) to create a compressed chunk \($file.chunk.compressed.$CHUNK_COUNTER.bz2\)
pbzip2 -9 -c $file.chunk.uncompressed > $file.chunk.compressed.$CHUNK_COUNTER.bz2
# 10# is to force bash to count in base 10, so that 008+ are valid
let CHUNK_COUNTER=$((10#$CHUNK_COUNTER+1))
let COUNTER=0
fi
done
#TODO need to compress lines in the last chunk too
done
IFS=$SAVED_IFS
我不喜欢它什么,是我的写作速度的限制,然后读解压缩块(15MB〜/ S) 。 直接从压缩文件中读取未压缩stram的速度是〜80MB/s。
如何使这个脚本能够直接在每个块中直接写入有限数量的行,同时直接写入压缩文件?
您可以将输出管道传送到您使用head
来砍文件的循环。
$ unrar p $file | (while :; do i=$[$i+1]; head -n 10000 | gzip > split.$i.gz; done)
,你必须还制定出的唯一的事情,就是如何终止循环,因为这将继续产生空文件。
这是留给读者的练习。
荏苒一个空文件,将给予一定的输出(用于GZ,这是26个字节),所以你可以测试为:
$ unrar p $file |
(while :; do
i=$[$i+1];
head -n 10000 | gzip > split.$i.gz;
if [ `stat -c %s split.$i.gz` -lt 30 ]; then rm split.$i.gz; break; fi;
done)
不得不为FreeBSD适应它,但是它随后成为了一种魅力。所以感谢和+1 – CodeReaper 2012-12-14 11:43:43
如果您不介意将文件包装在tar文件中,那么您可以使用tar
为您分割和压缩文件。
您可以使用tar -M --tape-length 1024
创建1兆字节的文件。请注意,在每100兆字节的tar之后,它会要求您在输入文件之前再次按下输入。所以你必须用自己的脚本来包装它,然后才能移动生成的文件。
Waht我不喜欢这个,它强制它是互动的。 – elhoim 2010-08-18 12:42:05
'IFS = $'\ n \ b''(你真的想),'CHUNK_COUNTER = $((10#000))'与* CHUNK_COUNTER = 0相同(只是使用中间变量而不是在输出和递增时来回转换) – 2010-08-18 15:11:54
'用于* .rar'中的文件 - 不需要'ls'。 – 2010-08-18 15:14:51