내 상태는 다음과 같습니다. 압축되지 않은 총 크기가 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입니다.
압축 된 파일에 직접 쓰는 동안 청크 당 제한된 수의 줄을 직접 스트리밍하도록이 스크립트를 어떻게 적용 할 수 있습니까?
'IFS = $ '\ n 개의 \의 b''가 (당신이 실제로 원하는 게 $ CHUNK_COUNTER = $ ((10 # 000))'은 정확히 CHUNK_COUNTER = 0와 동일합니다. (출력과 증가시 앞뒤로 변환하는 대신 중간 변수를 사용하십시오) –
아, 그리고 '.rar' 파일을 위해 -'ls'을 쓸 필요가 없습니다. –