tar、gz、zip、またはbzip2を使用してファイルを分割する[終了]


144

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

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


3
私はあなたの苦痛を感じますが、これはプログラミングに関係しているようではありません。
Jason S

1
多くの圧縮プログラム(7-Zipなど)は、圧縮ファイルを指定サイズのボリュームに分割して、配布を容易にすることができます。
マーティンリバセージ2009

これはsuperuser.comに属していますが、プライベートベータは明日まで開始されない、と聞いています。
JesperE 2009

なぜそのファイルを圧縮する必要があるのでしょうか。
Jan Jungnickel 2009

ここに掲載されている2つの実行可能なソリューションのいずれかがうまくいかない場合は、プログラミングソリューションが必要になります。
ジョシュア

回答:


253

split次の-bオプションを指定してコマンドを使用できます。

split -b 1024m file.tar.gz

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

copy /b file1 + file2 + file3 + file4 filetogether

編集:@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, ...

編集:質問が閉じており、最も効果的な解決策がこの回答の内容に非常に近いため、投稿を編集します。

# 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を使用できます。


7
あなたは、ファイル名を分割するために後に最後の引数として、接頭辞を追加しない場合は....のXaa、XAB、XAC、XADという名前のファイルに出力を得る
チャーリー

@チャーリー、ありがとう、私は私の答えを更新しました。
マッピー2009

2
実際に使用-b 1024MiBすると無効なバイト数であるというエラーが出ました。--bytes=1024m作品を使う。
ブライアン

またcat、ファイルを再構成するためにを使用する必要はありません。copy /b file1 + file2 + etc..Windowsで使用してから、Linuxにコピーして戻すと、tarは再構成されたtarballを読み取ることができます。試してみたところです。
ブライアン

1
Splitにはオプションがあります--numeric-suffixes。アルファベットではなく数値のサフィックスを使用します。
Jan-Philip Gehrcke博士、2015

27

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

copy /b file1 + file2 + file3 + file4 filetogether

また、使用することができますcopy /b file* filetogether- support.microsoft.com/kb/71161
EUG

5
これは、NTFSでのみ正常に機能し、ファイルがすでにNTFSソート順になっている場合にのみ機能します。FATまたはFAT32 =ブームでお試しください。
ジョシュア

+1ファイルが正しい順序であることを確認してください!
ブライアン

@ジョシュア公平に言えば、そうでない場合、あなたは悪い仕事の命名をしました。
jpmc26 2017

@ jpmc26:FAT32の不適切なディレクトリの並べ替えの習慣について知っていますか?
ジョシュア


8

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

 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バイトになります。


1
それsplitはすでに何をしているかです。
象09/07/13

1
ephemientねえ、私はそれだけを探していくつかの投稿を掘りました。特定のデバイスに分割コマンドもzipコマンド/バイナリもありません。これは完全に機能しました。このコードを分割コマンドとして機能するように準備します:)。@Adrian Panasiuk、ありがとうございました。それは私にとって完璧です。
m3nda 2015年

@ erm3ndaどういたしまして。
Adrian Panasiuk、2015年

しかし、私はテストしましたが、結果は分割ではなく完全なファイルでした。それはどのようになりますか?小さなデバイスでは大きなファイルだったので、長いプロセスでした。投稿しながらソリューションをテストしてください:(
m3nda

@ erm3nda一時ファイルの作成を避ける必要があると私たちに言ったことはありません!2番目のバリエーションをご覧ください。
Adrian Panasiuk、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.