2017-01-07 29 views
1

Linuxで250GBのgzipファイルを使用しています。これを250GBファイルに分割し、生成されたパーツファイルを即座に圧縮します圧縮されている必要があります)。 私はこれを使用してみました -.gzファイルを複数の1GB圧縮ファイル(.gz)に分割する

zcat file.gz | split -b 1G – file.gz.part 

しかし、これは、非圧縮ファイルを生成し、当然のようにしています。私はそれがこのように見えるように変更されますが、エラーが発生しました:

zcat file.gz | split -b 1G - file.gz.part | gzip 
gzip: compressed data not written to a terminal. Use -f to force compression. 
For help, type: gzip -h 

私もこれを試みたが、それはすべてのエラーをスローしませんでしたが、できるだけ早くそれらが生成された一部のファイルを圧縮しませんでした。私はこれが分割全体が完了したときに各ファイルを圧縮することを前提としています(分割が完了したら、すべての部分ファイルをパックし、単一のgzファイルを作成するかもしれません。

zcat file.gz | split -b 1G - file.gz.part && gzip 

は、私はそこにフィルタオプションですが、スプリットの私のバージョンは、したがって、フィルタはサポートされていません(GNUのcoreutilsの)8.4、であること hereをお読みください。

$ split --version 
split (GNU coreutils) 8.4 

好ましくは1つのライナーコード(可能な場合)またはシェルを使用して、これを達成するための適切な方法を教えてください(bashの/ kshの)スクリプトも動作します。 (いくつかのマイナーなミスがあるかもしれないので、私は実際にそれをテストしていない)

+0

私は、いくつかのスクリプト言語で独自の "split with gzip"を作成することをお勧めします。そうでなければ、その250 GBのファイルを何度も読み取る必要があります(最初にサイズを決定し、ループ内で常に1つのスプライスとgzipを使用します) – MacHala

+0

パーツが独立して圧縮解除可能であることの重要性はどれくらいですか?単純に 'split -b 1G file.gz'を実行すると、一緒にcatできて解凍できるファイル部分が250個になります。 –

答えて

1

GB_IN_BLOCKS=`expr 2048 \* 1024` 
GB=`expr $GB_IN_BLOCKS \* 512` 

COMPLETE_SIZE=`zcat asdf.gz | wc -c` 

PARTS=`expr $COMPLETE_SIZE \/ $GB` 

for i in `seq 0 $PARTS` 
do 
    zcat asdf.gz | dd skip=`expr $i \* GB_IN_BLOCKS` count=$GB_IN_BLOCKS | gzip > asdf.gz.part$i 
done 
0

分割は、フィルタコマンドをサポートし、それは間違いなく次善のだが、私はちょうど楽しみのためにbashでそれを書き込もうとしました。これを使用してください:

zcat file.gz | split - -b 1G --filter='gzip > $FILE.gz' file.part. 
+0

私の質問ですでに述べたように、私のバージョンのsplitは--filterオプションをサポートしていません。 –

関連する問題