29

According to this page, one can let tar create a tar archive "split" into 100 Mb files:

tar -c -M --tape-length=102400 --file=disk1.tar largefile.tgz

The problem is that this command will require you to interactively give a new filename for the next file, after the first file is filled.

Anybody knows of a way to skip this interactive step, and let tar do the "splitting" automatically?

1

7 Answers 7

21

Take a look at the --new-volume-script option, which lets you replace the prompting mechanism with a different mechanism or with a generated filename. ((tar.info)Multi-Volume Archives in the tar info page.) The problem with split is that you need to cat the pieces back together to do anything, whereas a multivolume archive should be a bit more flexible.

3
36

You can use split for this:

tar czpvf - /path/to/archive | split -d -b 100M - tardisk

This tells tar to send the data to stdout, and split to pick it from stdin - additionally using a numeric suffix (-d), a chunk size (-b) of 100M and using 'tardisk' as the base for the resulting filenames (tardisk00, tardisk01, tardisk02, etc.).

To extract the data afterwards you can use this:

cat tardisk* | tar xzpvf -
1
  • 2
    Small correction, -d is for numeric suffix, not prefix.
    – yclian
    Dec 23, 2014 at 13:16
8

Of course the best option to use is the --new-volume-script option.

But, if you know the size of the file (in this case, largefile.tgz), then you can do this also:

tar -c -M -L 102400 --file=disk1.tar --file=disk2.tar --file=disk3.tar largefile.tgz

Summary:

-c = Create
-M = multi-volume
-L 102400 = 100MB files (disk1.tar, disk2.tar, disk3.tar ...)

(For the -L, specify as many as needed so that the total sum of the tar files is larger than largefile.tgz)

If you are trying to tar a directory tree structure

3

it will automatically create files of size 1.1GB, if your tar is bigger in size, you can increase the number, for an example 1000 {2..1000} or you can increase the input to tape-length argument.

tar --tape-length=1048576 -cMv --file=tar_archive.{tar,tar-{2..100}} backup.tar.lzma
2

I've answered here with the better explanation here tar split archive

TLDR;

This command is creating 2GB chunks without the compression:

tar -cv --tape-length=2097000 --file=my_archive-{0..50}.tar file1 file2 dir3
1

I got it to work with the following commands:

mkdir -p ./split
rm -rf ./split/*
tar -cML 102400 -F 'cp "${TAR_ARCHIVE}" \
    ./split/part_${TAR_VOLUME}.tar' \
    -f split/part_1.tar large_file.tar.gz

The only problem is that part_1.tar will actually be the last file, and the others are shifted by one. I.e. part_2.tar is actually the first part, and part_k.tar is the (n - 1)th part. Fixing this with some shell script is trivial, and left as an exercise for the reader.

0

The easiest non-interactive way would be -

Creating multipart tar from a large file (say bigfile)

$ tar cvf small.tar -L1024 -F 'echo small.tar-${TAR_VOLUME} >&${TAR_FD}' bigfile

Extracting multipart tar to a specific directory (say /output/dir)

$ tar xvf small.tar -F 'echo small.tar-${TAR_VOLUME} >&${TAR_FD}' -C /output/dir

You are free to select any supported compression format, block size (1024K here) and archive name (which is small.tar here).

Not the answer you're looking for? Browse other questions tagged or ask your own question.