7

У меня есть tar-файл, который я хочу разделить на несколько меньших tar-файлов. Это было бы легко с split , но я хочу, чтобы разделенные файлы были полностью пригодными для использования самими tar-файлами, что split не может сделать, поскольку оно будет разделено в произвольных точках, а не на границах файлов.

Итак, как разделить файл tar на более мелкие части на границах файла, чтобы ни один файл не оказался наполовину в одном tar и наполовину в другом tar?

Решения, которые не используют tar и выполняют задачу другими способами, также приветствуются.

PS: Да, будут случаи, когда это невозможно (tar с файлами, размер которых превышает размер разделения).

3 ответа3

3

Если воссоздание архива является опцией, этот скрипт Bash должен сделать свое дело (это просто возможный способ):

#!/bin/bash

if [ $# != 3 ] ; then
    echo -e "$0 in out max\n"
    echo -e "\tin:  input directory"
    echo -e "\tout: output directory"
    echo -e "\tmax: split size threshold in bytes"
    exit
fi

IN=$1 OUT=$2 MAX=$3 SEQ=0 TOT=0
find $IN -type f |
while read i ; do du -bs "$i" ; done |
sort -n |
while read SIZE NAME ; do
    if [ $TOT != 0 ] && [ $((TOT+SIZE)) -gt $MAX ] ; then
        SEQ=$((SEQ+1)) TOT=0
    fi
    TOT=$((TOT+SIZE))
    TAR=$OUT/$(printf '%08d' $SEQ).tar
    tar rf $TAR "$NAME"
done

Он сортирует (по возрастанию) все файлы по размеру и начинает создавать архивы; он переключается на другой, когда размер превышает порог.

ПРИМЕЧАНИЕ. Убедитесь, что выходной каталог пуст.

ИСПОЛЬЗУЙТЕ НА СВОЙ РИСК

1

Я не верю, что существуют какие-либо инструменты для этого, но это было бы достаточно легко реализовать самостоятельно. Формат tar довольно прост, так что вам нужно иметь split , учитывающее его. Основная теория состоит в том, чтобы прочитать заголовок, посмотреть указанную длину входящего файла и определить, следует ли разделить сейчас или записать текущий файл. Прочитайте следующий заголовок и повторите.

1

Есть инструмент, tarsplitter который безопасно разбивает архивы tar. Вы указываете количество частей, на которые вы хотите разбить архив, и он будет определять, где находятся границы файлов.

https://github.com/AQUAOSOTech/tarsplitter

Выходные меньшие архивы не будут точно такого же размера, но довольно близки - при условии, что файлы в исходном архиве не имеют большого количества вариаций.

Пример - разбить архив «files.tar» на 4 меньших архива:

tarsplitter -p 4 -i files.tar -o /tmp/parts

Создание:

/tmp/parts0.tar
/tmp/parts1.tar
/tmp/parts2.tar
/tmp/parts3.tar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .