2010-08-18 3 views
1

내 상태는 다음과 같습니다. 압축되지 않은 총 크기가 150GB 인 일부 파일 (~ 60)을 포함하는 큰 (10GB) 압축 파일.큰 압축 로그 파일을 인라인 압축을 수행하는 동안 X 줄의 압축 된 덩어리로 분할

큰 압축 로그 파일을 특정 수의 줄이있는 부분 (예 : 1 백만 개)으로 분할 할 수 있기를 바랍니다.

나는 가 완전히 원본 파일을 압축 해제 포함하기 때문에 분할을 사용하지 않고, 내가 그 많은 디스크 공간을 사용할 수 없습니다.

은 무엇 내가 지금까지하고있는 중이 야하는 것은 이것이다 : 내가 좋아하지 않는 무엇

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

, 나는 쓰기의 속도에 의해 제한하고 압축 청크를 읽고있다한다는 것입니다 (~ 15메가바이트/S) . 압축 파일에서 압축되지 않은 stram을 직접 읽는 속도는 ~ 80MB/s입니다.

압축 된 파일에 직접 쓰는 동안 청크 당 제한된 수의 줄을 직접 스트리밍하도록이 스크립트를 어떻게 적용 할 수 있습니까?

+1

'IFS = $ '\ n 개의 \의 b''가 (당신이 실제로 원하는 게 $ CHUNK_COUNTER = $ ((10 # 000))'은 정확히 CHUNK_COUNTER = 0와 ​​동일합니다. (출력과 증가시 앞뒤로 변환하는 대신 중간 변수를 사용하십시오) –

+2

아, 그리고 '.rar' 파일을 위해 -'ls'을 쓸 필요가 없습니다. –

답변

2

파일을 자르기 위해 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) 
+0

FreeBSD에 조금 적응시켜야했지만 매력적이었습니다. 고마워 +1 – CodeReaper

-1

tar 파일로 파일을 감싸는 데 신경 쓰지 않는다면 tar을 사용하여 파일을 분할하고 압축 할 수 있습니다.

tar -M --tape-length 1024을 사용하여 1 메가 바이트 파일을 만들 수 있습니다. 100 메가 바이트의 타르 (tar)가 입력 될 때마다 파일을 다시 쓰기 시작하기 전에 Enter 키를 누르라는 메시지가 나타납니다. 따라서 스크립트를 직접 작성한 다음 결과 파일을 이동해야합니다.

+0

나는 이것이 대화 형이되도록 강요한다는 점에서 마음에 들지 않는다. – elhoim

관련 문제