#!/bin/bash # Copyright 2025 by Alexei Bezborodov # 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'