Скрипты для Linux
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

#!/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'