web-dev-qa-db-ja.com

tar、gz、Zip、またはbzip2を使用してファイルを分割する

約17〜20 GBの大きなファイルを圧縮する必要があります。ファイルごとに約1GBの複数のファイルに分割する必要があります。

Googleでソリューションを検索し、splitおよびcatコマンドを使用する方法を見つけました。しかし、大きなファイルにはまったく機能しませんでした。また、Windowsでは機能しません。 Windowsマシンで抽出する必要があります。

133
Aka

split コマンドと-bオプションを使用できます。

split -b 1024m file.tar.gz

@ Joshua の答えを使用して、Windowsマシンで再構築できます。

copy /b file1 + file2 + file3 + file4 filetogether

Edit:@Charlieが以下のコメントで述べたように、そうでない場合はxを使用するため、明示的にプレフィックスを設定することができます。

split -b 1024m "file.tar.gz" "file.tar.gz.part-"

// Creates files: file.tar.gz.part-aa, file.tar.gz.part-ab, file.tar.gz.part-ac, ...

Edit:質問が閉じられており、最も効果的なソリューションはこの回答の内容に非常に近いため、投稿を編集します。

# create archives
$ tar cz my_large_file_1 my_large_file_2 | split -b 1024MiB - myfiles_split.tgz_
# uncompress
$ cat myfiles_split.tgz_* | tar xz

このソリューションにより、(圧縮解除)時に中間の大きなファイルを使用する必要がなくなります。結果のファイルに別のディレクトリを使用するには、tar -Cオプションを使用します。ところで、アーカイブが単一のファイルのみで構成されている場合、tarは回避でき、gzipのみが使用されます。

# create archives
$ gzip -c my_large_file | split -b 1024MiB - myfile_split.gz_
# uncompress
$ cat myfile_split.gz_* | gunzip -c > my_large_file

Windowsの場合、同じコマンドの移植版をダウンロードするか、cygwinを使用できます。

241
matpie

Linuxから分割する場合でも、Windowsで再構築できます。

copy /b file1 + file2 + file3 + file4 filetogether
25
Joshua

tarを使用して 複数のアーカイブに分割

cygwinを含む、Windows上のtarファイルで動作するプログラムがたくさんあります。

9
Tim Hoolihan

テスト済みのコードは、最初に単一のアーカイブファイルを作成し、それを分割します。

 gzip -c file.orig > file.gz
 CHUNKSIZE=1073741824
 PARTCNT=$[$(stat -c%s file.gz) / $CHUNKSIZE]

 # the remainder is taken care of, for example for
 # 1 GiB + 1 bytes PARTCNT is 1 and seq 0 $PARTCNT covers
 # all of file
 for n in `seq 0 $PARTCNT`
 do
       dd if=file.gz of=part.$n bs=$CHUNKSIZE skip=$n count=1
 done

このバリアントは、単一のアーカイブファイルの作成を省略し、パーツの作成に直接進みます。

gzip -c file.orig |
    ( CHUNKSIZE=1073741824;
        i=0;
        while true; do
            i=$[i+1];
            head -c "$CHUNKSIZE" > "part.$i";
            [ "$CHUNKSIZE" -eq $(stat -c%s "part.$i") ] || break;
        done; )

このバリアントでは、アーカイブのファイルサイズが$CHUNKSIZEで割り切れる場合、最後の部分ファイルのファイルサイズは0バイトになります。

7
Adrian Panasiuk