Create a tar archive split into blocks of a maximum size
You can pipe tar to the split command:
tar cvzf - dir/ | split --bytes=200MB - sda1.backup.tar.gz.
On some *nix systems (like OS X) you may get the following error:
split: illegal option -- -
In that case try this (note the -b 200m
):
tar cvzf - dir/ | split -b 200m - sda1.backup.tar.gz.
If you happen to be trying to split the file to fit on a FAT32 formatted drive, use a byte limit of 4294967295. For example:
tar cvzf - /Applications/Install\ macOS\ Sierra.app/ | \
split -b 4294967295 - /Volumes/UNTITLED/install_macos_sierra.tgz.
When you want to extract the files use the following command (as of @Naftuli Kay commented):
cat sda1.backup.tar.gz.* | tar xzvf -
On macOS, the split
command works slightly differently:
$ tar cvzf - foo | split -b 2500m - foo.tgz.
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
You'll need a script for automation moving pseudo-tape.tar file to a new name:
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"