web-dev-qa-db-ja.com

最大サイズのブロックに分割されたtarアーカイブを作成する

かなり大きなディレクトリをバックアップする必要がありますが、個々のファイルのサイズに制限があります。基本的に、最大200MBのアーカイブに分割されるtar.(gz|bz2)アーカイブを作成したいと思います。 Clonezillaは、次のような名前のイメージバックアップを分割することにより、これと同様のことを行います。

sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac

これを1つのコマンドで実行する方法はありますか? splitコマンドの使用方法は理解していますが、1つの巨大なアーカイブを作成してから、それを小さなアーカイブに分割する必要はありません。これにより、最初に必要なディスク領域が2倍になるためです。アーカイブを作成します。

90
Naftuli Kay

Tarをsplitコマンドにパイプすることができます:

tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.

一部の* nixシステム(OS Xなど)では、次のエラーが発生する場合があります。

split: illegal option -- -

その場合は、これを試してください(-b 200m):

tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.

FAT32でフォーマットされたドライブに収まるようにファイルを分割しようとしている場合は、バイト数の制限を4294967295にしてください。次に例を示します。

tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
118
jordanm

MacOSでは、splitコマンドの動作が少し異なります。

$ tar cvzf - foo | split -b 2500m - foo.tgz.
14
Erik Kaplun

追加するだけ:vfat/fat32の最大許容ファイルサイズは2 ^ 32-1(4294967295バイト)なので、そのようなファイルシステムで最大許容ファイルサイズを指定したsplitコマンドは次のとおりです。

split -b4294967295 -d my_input_file my_output_file_splitted
5
Aydin K.
serega@serega-sv:~$ tar -c  -M --tape-length=1024 --file /tmp/pseudo-tape.tar --new-volume-script=/tmp/new-volume.sh --volno-file=/tmp/volno /tmp/stuff-to-archive 
tar: Removing leading `/' from member names
moving /tmp/pseudo-tape.tar to /tmp/archive.1
moving /tmp/pseudo-tape.tar to /tmp/archive.2
moving /tmp/pseudo-tape.tar to /tmp/archive.3

Pseudo-tape.tarファイルを新しい名前に自動化するためのスクリプトが必要です。

serega@serega-sv:~$ cat /tmp/new-volume.sh 
dir="/tmp"
base_name="pseudo-tape.tar"
next_volume_name=`echo -n "archive."; cat $dir/volno`
echo "moving $dir/$base_name to $dir/$next_volume_name"
mv "$dir/$base_name" "$dir/$next_volume_name"
3