それぞれ約60MBのgzファイルが8000個あります。それらをいくつかの大きなファイルにマージしたい。では、解凍せずにbashスクリプトでそれを行う方法は?
シェル スクリプトは、新しいファイル サイズまたは結合するファイルの数として入力を受け取る場合があります。
たとえば、1.gz、2.gz、3.gz ... 10.gz があるとします。たとえば、3 つのファイルごとに 1 つのファイルが必要なので、1.gz、2.gz、および 3.gz が 1_new に結合されます。 gz など。
gzip
ed ファイル を連結することは可能ですがgunzip
、結果のファイルを単一のストリームにする場合は、gzip のマニュアルを参照してください。
スクリプトは、Ansgar Wiechers のtar
.
#!/bin/bash
maxnum=$1
i=1
j=0
for f in *.gz; do
cat $f >> archive_$j.gz
i=$((i+1))
if [ $i -eq $maxnum ]; then
i=1
j=$((j+1))
fi
done
上記のコードはテストされていないことに注意してください。
物事を適切 tar
にアーカイブしたい場合はより良い解決策ですが、編集された多数のファイルを連結することだけが必要な場合は、gzip
このような連結が適しています。
gzip
単一のファイルのみを圧縮できます。tar
複数のファイルを 1 つのアーカイブに結合する必要があります。これは (オプションで) で圧縮できgzip
ます。圧縮ファイルをマージするだけの場合は、次のようなものを使用できます。
maxnum=$1
i=1
j=0
for f in *.gz; do
tar rf archive_$j.tar $f
if [ $i -eq $maxnum ]; then
i=1
j=$((j+1))
fi
done
これにより、圧縮されたソース ファイルを含む圧縮されていない tar ファイルが生成されます。
ただし、圧縮されていないソース ファイルを含む圧縮された tar ファイルを生成する場合は、圧縮された tar ファイルを更新できないため、上記の方法は機能しません。最初にソース ファイルを解凍してから、それらから圧縮された tar ファイルを作成する必要があります。
maxnum=$1
i=1
j=0
flist=
for f in *.gz; do
gunzip $f
flist="$flist $(basename $f .gz)"
if [ $i -eq $maxnum ]; then
tar czf archive_$j.tar.gz --remove-files $flist
i=1
j=$((j+1))
flist=
fi
done