Как разбить файл на множество небольших файлов, а затем восстановить их?

Мне нужно загрузить файл размером около ГБ на онлайн-сервер, чтобы добраться до друга. Теперь, похоже, проблема с моим интернет-соединением, потому что если я пытаюсь загрузить файл размером более 20 МБ, он просто останавливается и по какой-то причине не запускается снова.

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

  • Разделите файл на более мелкие файлы, где максимальный размер каждого файла может быть установлен пользователем, чтобы его можно было использовать в других случаях.

  • Может восстановить файл на другом конце и проверить целостность, проверив его SHA512SUM

Я бы предпочел, чтобы он ничего не сжимал. Я использую Ubuntu GNOME 16.04.1 с GNOME 3.20. Есть ли способ сделать это?

2 ответа

Решение

Я написал два небольших сценария, которые можно использовать для этого. Во-первых, поместите скрипт (назовите его "splitter" или что-нибудь еще) в отдельную папку с файлом, который нужно разбить, затем в bash:

./splitter FILE SIZE

Будучи ФАЙЛОМ, файл будет разделен и РАЗМЕР размера в МБ. После этого вы увидите все разделенные блоки (SPLITTED_FILE.aa, SPLITTED_FILE.ab и т. Д.), Файл контрольной суммы (SPLITTED_CHECK_SHA256SUM) и файл tar со всеми этими файлами внутри (SPLITTED_TAR.tar). Удалите все, кроме файла tar. Когда вам нужно отправить его, распакуйте его и отправьте отдельные файлы. Когда они появятся, поместите их снова в tar-файл с тем же именем (SPLITTED_TAR.tar) и поместите в отдельную папку со вторым сценарием ('mergefile' или как вы его называете). Бежать:

./mergefile

Он должен извлечь все файлы, объединить их в файл с тем же именем, что и исходный, и проверить сумму sha256.

Обратите внимание, что это очень сырой сценарий, поэтому просто используйте его точно так, как я описал, в отдельной папке, где больше ничего нет. Вот если вы хотите его использовать, подумайте, что проще сделать это вручную из командной строки... Но я хотел попрактиковаться в каком-то сценарии оболочки!

скрипт сплиттера:

#!/bin/bash

#Usage: splitter [FILENAME] [SIZE]

PROGRAMNAME=$(basename $0)
PREFIX='SPLITTED_FILE'

if [[ $# != 2 ]]; then
    echo "Usage: $PROGRAMNAME [FILENAME] [SIZE]"
    exit 1
fi

FILENAME=$1
SIZE=$2

if [[ -f $FILENAME ]]; then
    if [[ $SIZE =~ ^[0-9]+$ && $SIZE != 0 ]]; then
        sha256sum $FILENAME > SPLITTED_CHECK_SHA256SUM
        split -b ${SIZE}'M' $FILENAME $PREFIX
        tar -cf SPLITTED_TAR.tar SPLITTED_FILE* SPLITTED_CHECK_SHA256SUM
        echo "Done."
        exit
    else
        echo "$PROGRAMNAME: Invalid size"
        exit 1
    fi
else
    echo "$PROGRAMNAME: Invalid filename"
    exit 1
fi

скрипт mergefile:

#!/bin/bash

#Usage: mergefile

PROGRAMNAME=$(basename $0)
PREFIX='SPLITTED_FILE'

if [[ $# != 0 ]]; then
    echo "Usage: $PROGRAMNAME. No arguments (SPLITTED_TAR.tar will be merged)"
    exit 1
fi

FILENAME=""

if [[ -f 'SPLITTED_TAR.tar' ]]; then
    tar -xf 'SPLITTED_TAR.tar'
    FILENAME=$(cut -f 3 -d " " SPLITTED_CHECK_SHA256SUM)
    cat ./SPLITTED_FILE* > $FILENAME
    if [[ $(sha256sum $FILENAME | cut -f 3 -d " ") == $(cut -f 3 -d " " SPLITTED_CHECK_SHA256SUM) ]]; then
        echo "SHASUM Checks!"
    else
        echo "File corrupted (SHASUM doesn't check!)"
        exit 1
    fi
    echo "Done."
    exit
else
    echo "$PROGRAMNAME: SPLITTED_TAR.tar not found."
    exit 1
fi

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

И вот команды

split -b 20M -d bigfile bigfile-part
cat bigfile-part* > bigfile

Редактировать:

... и для части хеш-суммы вы можете сгенерировать файл контрольной суммы SHA512 из исходного ("большого") файла:

sha512sum bigfile > sha512.txt

После того как все мелкие части снова собраны воедино, проверьте еще раз с новым файлом и сравните значения.

Другие вопросы по тегам