代码之家  ›  专栏  ›  技术社区  ›  elhoim

在进行内联压缩时,将大的压缩日志文件拆分为X行的压缩块

  •  1
  • elhoim  · 技术社区  · 14 年前

    我想能够切片大的压缩日志文件成部分,其中有一定数量的行(即:100万)。

    不要 我想使用split,因为它需要完全解压缩原始文件,而且我没有那么多可用的磁盘空间。

    到目前为止,我所做的是:

    #!/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。

    2 回复  |  直到 14 年前
        1
  •  2
  •   mvds    14 年前

    可以通过管道将输出传输到使用 head 把文件切碎。

    $ unrar p $file | ( while :; do i=$[$i+1]; head -n 10000 | gzip > split.$i.gz; done )
    

    唯一需要解决的是如何终止循环,因为这将继续生成空文件。 这是留给读者的练习。

    $ 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 )
    
        2
  •  -1
  •   Wolph    14 年前

    如果您不介意将文件包装在tar文件中,那么您可以使用 tar 为您拆分和压缩文件。

    tar -M --tape-length 1024