Создать архив tar, разбитый на блоки максимального размера


83

Мне нужно сделать резервную копию довольно большого каталога, но я ограничен размером отдельных файлов. Я хотел бы по существу создать tar.(gz|bz2)архив, который разделен на максимальные архивы 200 МБ. Clonezilla делает что-то похожее на это, разбивая резервные копии изображений, названные так:

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

Есть ли способ, которым я могу сделать это в одной команде? Я понимаю, как использовать splitкоманду, но мне бы не хотелось создавать один гигантский архив, а затем разбивать его на более мелкие архивы, поскольку это удвоило бы дисковое пространство, необходимое для первоначального создания архива.


Связанный вопрос: superuser.com/q/290986/11574
sampablokuper

Ответы:


108

Вы можете передать 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.

3
Большой! Как я могу извлечь архив?
Нафтули Кей

24
Будешь cat sda1.backup.tar.gz.* | tar xzvf -делать работу?
Нафтули Кей

3
Да, так и должно быть. splitпо умолчанию устанавливает имена файлов так, чтобы при сортировке по LOCALE (что делается с помощью оболочки), они будут в правильном порядке.
Иордания

4
Без многословия, просто обойтись tar czf ...без vи объединить cat backup.tar.gz.* | tar tar xzf - без v. Я не вижу никакой выгоды от подробного вывода здесь v.
Лео Леопольд Герц 준영

1
Просто помог другу по упаковке Xcode на FAT32 отформатирован флэш - диск с: tar cvzf - Xcode.app/ | split -b 2000m - /Volumes/PH/xcode/xcode.tgz(используется с cd /Applications/) Спасибо вам большое :)
ecth


4

Просто добавьте: Поскольку максимально допустимый размер файла в vfat / fat32 составляет 2 ^ 32 минус 1 (4294967295 байт), команда split с максимально допустимым размером файла в такой файловой системе:

split -b4294967295 -d my_input_file my_output_file_splitted

3
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

Вам понадобится скрипт для автоматизации перемещения файла псевдо-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"

Я не понизил ваш ответ, потому что я рад видеть тот, который использует -M --tape-length. Однако этот ответ игнорирует запрос OP на решение, использующее сжатие gzip или bzip2.
Сампаблокупер

Внимание: вы говорите не о tarклоне tar, который называется gtar(GNU tar). Этот tar-клон поддерживает создание многотомных архивов, но с заметной вероятностью не может / не хочет извлекать из этих многотомных архивов, поскольку неправильно утверждает, что последующий том не является правильной частью продолжения.
1832 года
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.