Эта строка вызовет проблемы:
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
Разбейте его на несколько архивов в источнике.
Используйте du, чтобы обнаружить некоторые из самых больших каталогов и заархивировать/сжать их в первую очередь (используйте tar | gzip или вариант прямого сжатия tar ). Скопируйте этот файл.tgz на удаленный диск, проверьте размер, а затем удалите его с основного диска.
Повторите эти действия для других больших каталогов, пока не заархивируете около 5 ГБ.
Наконец, заархивируйте и сожмите базовый каталог, но используйте параметр exclude в tar, чтобы назвать уже заархивированные каталоги.
В качестве альтернативы вы можете использовать tar и gzip через каналы, а затем передать их в ssh для записи на удаленный диск. Что-то вроде (проверьте параметры):
tar cfz - myBaseDir | ssh myRemote 'cat > myArchive.tg z'
Насколько мне известно, -лайнера для этого не существует. Но я написал небольшой 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
.