Вопрос или проблема
Мне нужно создать резервную копию довольно большой директории, но я ограничен размером отдельных файлов. Я хотел бы создать архив tar.(gz|bz2)
, который разбит на архивы максимального размера 200 МБ. Clonezilla делает что-то подобное, разбивая резервные копии образов, которые называются следующим образом:
sda1.backup.tar.gz.aa
sda1.backup.tar.gz.ab
sda1.backup.tar.gz.ac
Есть ли способ сделать это одной командой? Я понимаю, как использовать команду split
, но мне не хотелось бы сначала создавать один гигантский архив, а затем разбивать его на более мелкие архивы, так как это удвоило бы пространство на диске, необходимое для первоначального создания архива.
Вы можете передать 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.
Когда вы захотите извлечь файлы, используйте следующую команду (как прокомментировал @Naftuli Kay):
cat sda1.backup.tar.gz.* | tar xzvf -
tar
разбитый архив
Я нашел это лучшим решением по нескольким причинам:
- Он создает части без взаимодействия, автоматически именуя части
- Вы можете использовать любую сжатие, какое хотите, обычные опции
tar
- Не требует внешних команд для разделения или объединения
- Не использует дополнительное дисковое пространство (промежуточное)
- Любой разархиватор легко обрабатывает, так как каждый архив является самодостаточным
- Увеличивает безопасность, так как каждый архив самодостаточен, файлы не охватывают несколько архивов
Эта команда создает части по 2 ГБ без сжатия:
tar -cv --tape-length=2097000 --file=my_archive-{0..50}.tar file1 file2 dir3
- c для создания
- v для вывода подробной информации, чтобы перечислить файлы, добавленные в архив
- –tape-length это размер части: вы можете добавить суффикс, если вы его пропустите, предполагается килобайт (отсюда 2 миллиона для 2 гигабайт)
- –file это место, где мы магически создаем имена для частей: мы произвольно указали 50, но вы можете поставить любое достаточно большое число, только те, что нужны, будут использованы
- список файлов и директорий, которые нужно включить в архивы
tar с gzip
Аналогично, эта команда создает части по 1 ГБ с gzip сжатием:
tar -czv --tape-length=2097000 --file=my_archive-{0..50}.tar.gz file1 file2 dir3
2024-10-10 Примечание: Невозможно на GNU tar. В GNU tar параметры сжатия и многотомные опции несовместимы. Вы не можете использовать их одновременно. Если вы попытаетесь, вы получите сообщение об ошибке Cannot use multi-volume compressed archives
. Посмотрите в исходном коде: https://git.savannah.gnu.org/cgit/tar.git/tree/src/tar.c#n2603
В macOS команда split
работает немного иначе:
$ tar cvzf - foo | split -b 2500m - foo.tgz.
Просто чтобы добавить: так как максимальный допустимый размер файла в vfat/fat32 равен 2^32 минус 1 (4294967295 байт), команда split с максимальным разрешенным размером файла на такой файловой системе будет:
split -b4294967295 -d my_input_file my_output_file_splitted
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"
Просто чтобы добавить свой вклад, я недавно написал приложение, которое разбивает тарболлы по границам файлов, которое может быть вам полезно:
Вместо tar я бы использовал 7zip или другой архиватор, который может нативно разбивать архив по границам файлов.
С командой split у вас могут быть проблемы с восстановлением поврежденных архивов, когда повреждена лишь одна часть серии.
7z и некоторые другие архивы дополнительно могут создавать сумму восстановления, добавляемую к архивам, или даже иметь опцию добавления объемов восстановления, что спасает вас, когда вы теряете или повреждаете целую часть.
Ответ или решение
Для выполнения задачи создания архивов формата tar (сжатых gzip или bzip2), которые будут разбиты на блоки максимального размера 200 МБ, необходимо использовать команду tar
в сочетании с командой split
. Это обеспечивает эффективное использование пространства и позволяет избежать временных затрат на создание больших промежуточных файлов. В данной статье мы подробно рассмотрим, как это сделать, с фокусом на важных аспектах и нюансах.
Шаг 1: Использование команды tar
и split
Для создания архива и его последующего разбиения на части, вы можете выполнить следующую команду в терминале:
tar cvzf - /путь/к/директории/ | split --bytes=200MB - имя_архива.tar.gz.
Здесь ключевые моменты:
tar cvzf - /путь/к/директории/
– создаёт архив в формате gzip из указанной директории и отправляет его на стандартный вывод.split --bytes=200MB - имя_архива.tar.gz.
– разбивает выходные данныеtar
на сегменты размером 200 МБ, сохраняя их с именами, начинающимися симя_архива.tar.gz.
Обратите внимание, что для систем, таких как macOS, команда split
может требовать другого формата, например:
tar cvzf - /путь/к/директории/ | split -b 200m - имя_архива.tar.gz.
Шаг 2: Извлечение файлов из разбитых архивов
Когда вам потребуется восстановить данные из созданных архивов, вы можете использовать следующую команду:
cat имя_архива.tar.gz.* | tar xzvf -
Этот процесс объединяет части архивов и извлекает содержимое. Важно помнить, что порядок имен частей имеет значение, чтобы данные были собраны корректно.
Примечания о файловых системах
Если вы планируете хранить архивы на файловых системах типа FAT32, обратите внимание на ограничения размера файла, который составляет чуть меньше 4 ГБ. Таким образом, следует использовать команду split
с учетом этого ограничения:
tar cvzf - /путь/к/директории/ | split -b 4294967295 - имя_архива.tar.gz.
Альтернативные решения
Не менее эффективно использовать инструменты такие как 7zip
, которые могут непосредственно создавать архивы с разбиением, обеспечивая надежность сохранения данных. 7zip
автоматически обрабатывает разбиение по размеру, что исключает необходимость использования дополнительных команд.
Заключение
Процесс создания архивов формата tar с разбиением на части — это мощный инструмент для резервного копирования больших директорий, особенно в условиях ограниченного пространств. Используя упомянутые команды, вы можете сохранить данные эффективно и безопасно, не прибегая к значительным затратам памяти. Выбор подходящих команд и параметров позволяет отражать индивидуальные потребности и соответствовать спецификациям различных файловых систем.