それぞれ約60MBのgzファイルが8000個あります。それらをいくつかの大きなファイルにマージしたい。では、解凍せずにbashスクリプトでそれを行う方法は?
シェル スクリプトは、新しいファイル サイズまたは結合するファイルの数として入力を受け取る場合があります。
たとえば、1.gz、2.gz、3.gz ... 10.gz があるとします。たとえば、3 つのファイルごとに 1 つのファイルが必要なので、1.gz、2.gz、および 3.gz が 1_new に結合されます。 gz など。
gziped ファイル  を連結することは可能ですが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