You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
317 lines
11 KiB
317 lines
11 KiB
#!/bin/bash |
|
|
|
# Copyright 2025 by Alexei Bezborodov <AlexeiBv+linux_script@narod.ru> |
|
# License: Public domain: http://unlicense.org/ |
|
# Общественное достояние |
|
|
|
[ "${alias_dir}" = "" ] && alias_dir=$(pwd) |
|
source "${alias_dir}/common" |
|
|
|
backup_restore() |
|
{ |
|
in_file=$1 |
|
in_dir=$1 |
|
[ "$in_file" = '' || "$in_dir" = '' ] && printf "Укажите файл для распаковки и директурию, куда распаковывать, например 'backup_restore backup.tgz /home'\n" && return |
|
printf "Произойдёт распаковка файла '$in_file' в папку '$in_dir'\n" |
|
ask_continue && return |
|
sudo tar xvpzf "$in_file" -C "$in_dir" |
|
} |
|
mkalias_with_prefix 'backup_restore' |
|
|
|
backup_delete_old_files_by_regex() |
|
{ |
|
backup_dir=$1 |
|
file_regex=$2 |
|
file_max_count=$3 |
|
filter=$4 |
|
|
|
file_max_count=$((file_max_count+1)) # tail не так работает |
|
find "${backup_dir}" -regextype posix-extended -regex ".*${file_regex}" | grep -Ev "${filter}" | sort -r | tail -n +${file_max_count} | xargs -d '\n' rm -f |
|
} |
|
mkalias_with_prefix 'backup_delete_old_files_by_regex' |
|
|
|
# | grep -Ev "01d" |
|
# cur_date=$(date +%Yy_%mm_%dd) |
|
# '.*([^1])-zakonvremeni_backup.tar' |
|
# '.*1-zakonvremeni_backup.tar' |
|
|
|
backup_delete_old_files_by_date() |
|
{ |
|
backup_dir=$1 |
|
file_name_template=$2 |
|
[[ "$backup_dir" == '' || "$file_name_template" == '' ]] && printf "Укажите имя папки и шаблон имени, например 'delete_old_backup_files_by_date backup/ host_name_@DATE.zip 3 4 5'. '@DATE' - означает дату в формате 'date +%%Yy_%%mm_%%dd', 3 - максимальное количество файлов сохраняемых ежедневно, 4 - ежемесячно, 5 - ежегодно\n" && return |
|
file_max_count_every_day=$3 |
|
file_max_count_every_month=$4 |
|
file_max_count_every_year=$5 |
|
by_week=$6 |
|
|
|
[[ "$file_max_count_every_day" == '' ]] && file_max_count_every_day=2 |
|
[[ "$file_max_count_every_month" == '' ]] && file_max_count_every_month=2 |
|
[[ "$file_max_count_every_year" == '' ]] && file_max_count_every_year=2 |
|
|
|
if [[ "$by_week" == "" ]]; then |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*'}" "${file_max_count_every_day}" 'm_01d|y_03m_01d' |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*m_01d.*'}" "${file_max_count_every_month}" 'y_03m_01d' |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*y_03m_01d.*'}" "${file_max_count_every_year}" '________NOTHONG___________' |
|
else |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*'}" "${file_max_count_every_day}" '1v-|11v-' |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*1v.*'}" "${file_max_count_every_month}" '11v-' |
|
backup_delete_old_files_by_regex "${backup_dir}" "${file_name_template//'@DATE'/'.*11v-.*'}" "${file_max_count_every_year}" '________NOTHONG___________' |
|
fi |
|
|
|
# test |
|
# for (( y = 2001; y < 2010; y++ )) do for (( m = 1; m < 10; m++ )) do for (( d = 1; d < 10; d++ )) do touch "backup_${y}y_0${m}m_0${d}d.zip"; backup_delete_old_files_by_date ./ "backup_@DATE\.zip" 2 2 2; sleep 0.15; done; done; done; |
|
# for (( y = 2001; y < 2010; y++ )) do for (( v = 10; v < 51; v++ )) do touch "backup_${y}y_01m_01d-${v}v-10H.zip"; backup_delete_old_files_by_date ./ "backup_@DATE\.zip" 2 2 2 week; sleep 0.15; done; done; |
|
} |
|
mkalias_with_prefix 'backup_delete_old_files_by_date' |
|
|
|
backup_date_week() |
|
{ |
|
echo "$(date +%Vv)" |
|
} |
|
mkalias_with_prefix 'backup_date_week' |
|
|
|
backup_date_year() |
|
{ |
|
echo "$(date +%Yy)" |
|
} |
|
mkalias_with_prefix 'backup_date_year' |
|
|
|
backup_date_day() |
|
{ |
|
week=$(backup_date_week) |
|
year=$(backup_date_year) |
|
echo "${year}_$(date +%mm_%dd)-${week}" |
|
} |
|
mkalias_with_prefix 'backup_date_day' |
|
|
|
backup_date() |
|
{ |
|
day=$(backup_date_day) |
|
echo "${day}-$(date +%Hh_%Mm_%Ss)" |
|
} |
|
mkalias_with_prefix 'backup_date' |
|
|
|
exclude_mozilla=' |
|
--exclude=.mozilla/firefox/*/Cache |
|
--exclude=.mozilla/firefox/*/storage/*/https* |
|
--exclude=.mozilla/firefox/*/storage/*/http* |
|
--exclude=.mozilla/firefox/*/storage/*/file* |
|
' |
|
|
|
backup_firefox() |
|
{ |
|
eval $(mkvar 'backup_dir|$1||Укажите папку для бекапа') |
|
eval $(mkvar 'user|$2|$(whoami)') |
|
eval $(mkvar 'file_add_name|$4|mozilla_backup') |
|
eval $(mkvar 'file|$3|${backup_dir}/$(hostname)_${user}_${file_add_name}_$(backup_date).tgz') |
|
#ask_continue && return |
|
|
|
echo "$(backup_date): Делаем бэкап /.mozilla в файл '${file}'" |
|
|
|
tar cvpzf "${file}" \ |
|
${exclude_mozilla//'\n'/' '} \ |
|
/home/${user}/.mozilla |
|
|
|
echo "${file}" |
|
} |
|
mkalias_with_prefix 'backup_firefox' |
|
|
|
exclude_home=' |
|
--exclude=*/Загрузки/* \ |
|
--exclude=*/Backup/* \ |
|
--exclude=*/Музыка/* \ |
|
--exclude=MyProgs \ |
|
--exclude=media \ |
|
--exclude=private \ |
|
--exclude=.thumbnails \ |
|
--exclude=*/.cache/* \ |
|
--exclude=/.config/chromium/*/CacheStorage \ |
|
--exclude=*/.config/skypeforlinux/Cache \ |
|
--exclude=.local \ |
|
--exclude=.var/app/app.organicmaps.desktop/data \ |
|
--exclude=.steam \ |
|
--exclude=.smartgit/updates \ |
|
--exclude=.wine*/*/windows/ \ |
|
--exclude=.googleearth \ |
|
--exclude=*/.Genymobile \ |
|
--exclude=go/pkg \ |
|
--exclude=.apt \ |
|
--exclude=.npm \ |
|
--exclude=.gradle \ |
|
--exclude=Android \ |
|
--exclude=build/intermediates \ |
|
--exclude=build/*.obj \ |
|
--exclude=chromium/*/WebStorage \ |
|
--exclude=.android \ |
|
--exclude=.VirtualBox/*.iso \ |
|
' |
|
|
|
backup_home() |
|
{ |
|
eval $(mkvar 'backup_dir|$1||Укажите папку для бекапа') |
|
eval $(mkvar 'file_add_name|$3|home_backup') |
|
eval $(mkvar 'file|$2|${backup_dir}/$(hostname)_${file_add_name}_$(backup_date).tgz') |
|
#ask_continue && return |
|
|
|
echo "$(backup_date): Делаем бэкап /home в файл '${file}'" |
|
|
|
sudo tar cvpzf "${file}" \ |
|
--exclude=/*${file_add_name}*.tgz \ |
|
${exclude_mozilla//'\n'/' '} \ |
|
${exclude_home//'\n'/' '} \ |
|
/home |
|
} |
|
mkalias_with_prefix 'backup_home' |
|
|
|
backup_etc() |
|
{ |
|
eval $(mkvar 'backup_dir|$1||Укажите папку для бекапа') |
|
eval $(mkvar 'file_add_name|$3|sys_etc_backup') |
|
eval $(mkvar 'file|$2|${backup_dir}/$(hostname)_${file_add_name}_$(backup_date).tgz') |
|
#ask_continue && return |
|
|
|
echo "$(backup_date): Делаем бэкап /etc в файл '${file}'" |
|
|
|
sudo tar cvpzf "${file}" \ |
|
/etc |
|
} |
|
mkalias_with_prefix 'backup_etc' |
|
|
|
backup_sys() |
|
{ |
|
exclude_sys=' |
|
--exclude=/proc \ |
|
--exclude=/dev \ |
|
--exclude=/lost+found \ |
|
--exclude=/mnt \ |
|
--exclude=/run/media \ |
|
--exclude=/sys \ |
|
--exclude=/home \ |
|
--exclude=/media \ |
|
--exclude=/var/log \ |
|
--exclude=/var/cache \ |
|
--exclude=/var/lib/flatpak \ |
|
--exclude=/var/tmp \ |
|
--exclude=/usr/share \ |
|
--exclude=/tmp \ |
|
--exclude=/opt \ |
|
' |
|
eval $(mkvar 'backup_dir|$1||Укажите папку для бекапа') |
|
eval $(mkvar 'file_add_name|$3|sysbackup') |
|
eval $(mkvar 'file|$2|${backup_dir}/$(hostname)_${file_add_name}_$(backup_date).tgz') |
|
#ask_continue && return |
|
|
|
echo "$(backup_date): Делаем бэкап / в файл '${file}'" |
|
|
|
sudo tar cvpzf "${file}" \ |
|
--exclude=/*${file_add_name}*.tgz \ |
|
${exclude_sys//'\n'/' '} \ |
|
/ |
|
echo "${file}" |
|
} |
|
mkalias_with_prefix 'backup_sys' |
|
|
|
backup_firefox_and_del_old_files() |
|
{ |
|
backup_dir=$1 |
|
[ "$backup_dir" = '' ] && backup_dir=$(pwd) && printf "Папка для бекапа '${backup_dir}'\n" |
|
eval $(mkvar 'user|$2|$(whoami)') |
|
#ask_continue && return |
|
|
|
backup_host_dir="${backup_dir}/$(hostname)" |
|
mkdir "${backup_host_dir}" |
|
backup_ff_dir="${backup_host_dir}/firefox_${user}" |
|
mkdir "${backup_ff_dir}" |
|
|
|
file_add_name="mozilla_backup" |
|
file_pref="${backup_ff_dir}/$(hostname)_${user}_${file_add_name}_" |
|
compgen -G "${file_pref}*$(backup_date_year)*$(backup_date_week)*" && printf "$(backup_date): На этой неделе уже делался бэкап\n" && return |
|
|
|
file="${file_pref}$(backup_date).tgz" |
|
|
|
backup_firefox "${backup_ff_dir}" "${user}" "${file}" "${file_add_name}" |
|
backup_delete_old_files_by_date "${backup_ff_dir}" "${file_add_name}_@DATE\.tgz" 3 2 2 week |
|
} |
|
mkalias_with_prefix 'backup_firefox_and_del_old_files' |
|
|
|
backup_home_and_del_old_files() |
|
{ |
|
backup_dir=$1 |
|
[ "$backup_dir" = '' ] && backup_dir=$(pwd) && printf "Папка для бекапа '${backup_dir}'\n" |
|
#ask_continue && return |
|
|
|
backup_host_dir="${backup_dir}/$(hostname)" |
|
mkdir "${backup_host_dir}" |
|
backup_home_dir="${backup_host_dir}/home" |
|
mkdir "${backup_home_dir}" |
|
|
|
file_add_name="home_backup" |
|
file_pref="${backup_home_dir}/$(hostname)_${file_add_name}_" |
|
compgen -G "${file_pref}*$(backup_date_year)*$(backup_date_week)*" && printf "$(backup_date): На этой неделе уже делался бэкап\n" && return |
|
|
|
file="${file_pref}$(backup_date).tgz" |
|
|
|
backup_home "${backup_home_dir}" "${file}" "${file_add_name}" |
|
backup_delete_old_files_by_date "${backup_home_dir}" "${file_add_name}_@DATE\.tgz" 2 1 1 week |
|
} |
|
mkalias_with_prefix 'backup_home_and_del_old_files' |
|
|
|
backup_sys_and_del_old_files() |
|
{ |
|
backup_dir=$1 |
|
[ "$backup_dir" = '' ] && backup_dir=$(pwd) && printf "Папка для бекапа '${backup_dir}'\n" |
|
#ask_continue && return |
|
|
|
backup_host_dir="${backup_dir}/$(hostname)" |
|
mkdir "${backup_host_dir}" |
|
backup_sys_dir="${backup_host_dir}/sys" |
|
mkdir "${backup_sys_dir}" |
|
|
|
file_add_name="sys_etc_backup" |
|
file_pref="${backup_sys_dir}/$(hostname)_${file_add_name}_" |
|
compgen -G "${file_pref}$(backup_date_day)*" && printf "$(backup_date): Сегодня уже делался бэкап\n" && return |
|
|
|
file="${file_pref}$(backup_date).tgz" |
|
|
|
backup_etc "${backup_sys_dir}" "${file}" "${file_add_name}" |
|
backup_delete_old_files_by_date "${backup_sys_dir}" "${file_add_name}_@DATE\.tgz" 3 3 3 |
|
} |
|
mkalias_with_prefix 'backup_sys_and_del_old_files' |
|
|
|
backup_crontab_firefox() |
|
{ |
|
eval $(mkvar 'backup_dir|$1|$(pwd)') |
|
eval $(mkvar 'user|$2|$(whoami)') |
|
sudo_="" |
|
[[ "$user" != "$(whoami)" ]] && sudo_="sudo" |
|
cmd="1 * * * * bash -c 'source /home/$(whoami)/.bashrc && backup_firefox_and_del_old_files \"${backup_dir}\" $user >> /home/$(whoami)/Backup/backup_firefox.log'" |
|
echo "Будет установлена команда '${cmd}' с правами ${sudo_}" |
|
ask_continue && return |
|
crontab_add "${cmd}" ${sudo_} |
|
} |
|
mkalias_with_prefix 'backup_crontab_firefox' |
|
|
|
backup_crontab_home() |
|
{ |
|
eval $(mkvar 'backup_dir|$1|$(pwd)') |
|
eval $(mkvar 'user|$2|$(whoami)') |
|
sudo_="sudo" |
|
cmd="1 * * * * bash -c 'source /home/${user}/.bashrc && backup_home_and_del_old_files \"${backup_dir}\" >> /home/${user}/Backup/backup_home.log'" |
|
echo "Будет установлена команда '${cmd}' с правами ${sudo_}" |
|
ask_continue && return |
|
crontab_add "${cmd}" ${sudo_} |
|
} |
|
mkalias_with_prefix 'backup_crontab_home' |
|
|
|
backup_crontab_etc() |
|
{ |
|
eval $(mkvar 'backup_dir|$1|$(pwd)') |
|
eval $(mkvar 'user|$2|$(whoami)') |
|
sudo_="sudo" |
|
cmd="1 * * * * bash -c 'source /home/${user}/.bashrc && backup_sys_and_del_old_files \"${backup_dir}\" >> /home/${user}/Backup/backup_etc.log'" |
|
echo "Будет установлена команда '${cmd}' с правами ${sudo_}" |
|
ask_continue && return |
|
crontab_add "${cmd}" ${sudo_} |
|
} |
|
mkalias_with_prefix 'backup_crontab_etc'
|
|
|