Как создать сжатый архив, разделенный на несколько файлов, при нехватке места

Эта строка вызовет проблемы:

tar -cjf $dirbackup$server.tar.zip $server

Это потому, что $serverбудет чем-то вроде /home/myserver, поэтому эта команда расширится до

tar -cjf /save/2019-04-13/home/myserver.tar.zip /home/myserver

Обратите внимание на лишний /homeв пути к tar-файлу.

Вместо этого мы можем заранее изменить каталог..

#!/bin/bash
backupdate=$(date +%Y-%m-%d)
dirbackup=/save/$backupdate
mkdir $dirbackup || exit
cd /home || exit

for server in *
do
    echo $server"test"
    tar -cjf $dirbackup$server.tar.zip $server
done
0
03.05.2020, 23:43
2 ответа

Разбейте его на несколько архивов в источнике.

Используйте du, чтобы обнаружить некоторые из самых больших каталогов и заархивировать/сжать их в первую очередь (используйте tar | gzip или вариант прямого сжатия tar ). Скопируйте этот файл.tgz на удаленный диск, проверьте размер, а затем удалите его с основного диска.

Повторите эти действия для других больших каталогов, пока не заархивируете около 5 ГБ.

Наконец, заархивируйте и сожмите базовый каталог, но используйте параметр exclude в tar, чтобы назвать уже заархивированные каталоги.

В качестве альтернативы вы можете использовать tar и gzip через каналы, а затем передать их в ssh для записи на удаленный диск. Что-то вроде (проверьте параметры):

tar cfz - myBaseDir | ssh myRemote 'cat > myArchive.tg z'
1
28.04.2021, 23:16

Насколько мне известно, -лайнера для этого не существует. Но я написал небольшой bash-скрипт, который поместил все файлы в несколько tar-пакетов.

#!/bin/bash

package_i=1
all_files=$(find. -name "*" -type f)

# stop on every 100 MB for now
max_size=104857600

for f in $all_files; do
        #
        # add file to current tar file
        #
        tar -rvf package${package_i}.tar $f

        #
        # check if the size is more than 100 MB
        # if so, then wait till current package tar
        # was moved by user to another storage
        # and then proceed
        #
        size_of_current_package=$(stat --printf="%s" package${package_i}.tar)
        if [ $size_of_current_package -ge $max_size ]; then
                read -p "Will wait when you moved package${package_i}.tar to another storage..."
                package_i=$(( $package_i + 1 ))
                echo "=== Package iterator is now '${package_i}' ==="
        fi
done

Скрипт добавляет файл за файлом в текущий packageX.tarфайл (package1.tar, package2.tarи т. д. ). Если этот файл packageX.tarпревышает некоторое количество байтов (, в этом примере это количество составляет 100 МБ или 104857600 байт ), тогда он будет ждать, пока пользователь скопирует файл packageX.tarв другое хранилище, и продолжит после того, как пользователь нажмет Enter.

0
28.04.2021, 23:16

Теги

Похожие вопросы