--- 标签: - 壳类别: - Linux日期:# 创建时间:2025-03-27# 更新时间:2024-01-19---
使用 ShellScript 自动归档文件¶
一、简介我们将介绍一个 shell 脚本,它可以在 Linux 上自动归档文件夹。¶
2. 环境要求- 操作系统:带 SHELL(sh) 的 Linux,也可能是其他 Unix。- bash:Linux bash。¶
3. 脚本该脚本可以自动将配置的文件夹返回到配置的目的地:```¶
########################## Global Config¶
Source Folder¶
SERVICE_SOURCE="${HOMEDIR}"
Local Backup Folder¶
HDD_PACK_BACK="\({HDD_BASE}" __LOCAL_CLOUD_OD__="\)/BackUp"
########################## Global Config¶
########################### Service¶
declare -A SERVICES=( ["services"]="\({__SERVICE_SOURCE__}/services,\)/services.log" )
########################### Service¶
log 1:MSG [2:LOG_PRITORITY]¶
log() { log_time=\((date +"%b %e %T") if [ "\)" -lt 1 ]; then false else log_msg="\({1}" fi if [ "\)" -lt 2 ]; then log_prio=7 else log_prio=${2} fi logger -p \({__log_prio__} -t "\)(basename \({0})" "\){log_msg}" echo "${log_time} $(basename \({0}) (\){log_prio}): ${log_msg}" >> ${LOGFILE} }
Encrypter 1:SOURCE_FILE 2:DEST_FOLDER [3:RECEIVER]¶
Encrypter() { receiver="xxxxxxxxxxxxxxxx" if [ "\({#}" -lt 2 ]; then false elif [ "\)" -eq 3 ]; then receiver=${3} fi
__encrypt_file__=${2}/${1##*/}.gpg
log "dest encrypt file: ${__encrypt_file__}"
# Delete exist NOT Uploaded file
if [ -e ${__encrypt_file__} ]; then
rm ${__encrypt_file__}
log "Deleted exist file: ${__encrypt_file__} ......Done"
fi
# Encrypting packed files to DEST_FOLDER
gpg -e -r ${__receiver__} -o ${__encrypt_file__} ${1}
if [ -e ${__encrypt_file__} ]; then
log "Encrypted...... ${__encrypt_file__} to __LOCAL_CLOUD_OD__ ......Done"
fi
}
Packer 1:SOURCE_FOLDER(whole path) 2:PACKED_DEST_FOLDER [3:ENCRYPT_DEST_FOLDER]¶
If only use first 2 parameters, will not encrypt;¶
If you wish to encrypt, you should use all 3 parameters.¶
Packer() { # if end without "/" service_name=${1##/} # if end with "/" if [[ \({__service_name__} == "" ]]; then __service_name__="\)" service_name="${service_name##/}" fi
__tar_file__=${2}/${__service_name__}_$(date "+%Y%m%d").tar.gz
# Packing
if [ ! -e ${__tar_file__} ]; then
# Packing folder
tar -zcvf ${__tar_file__} ${1}
log "Packed up ${__tar_file__} ......Done"
# Encrypt from PACKED_DEST_FOLDER to ENCRYPT_DEST_FOLDER
if [ -e ${__tar_file__} ]; then
log "Save NOT encrypt file: ${__tar_file__} ......Done"
# Check if need encryption
if [ "${#}" -eq 3 ]; then
Encrypter ${__tar_file__} ${3}
fi
fi
fi
}
PersonalFileBackUper 1:SOURCE_FOLDER 2:LOG_FILE¶
PersonalFileBackUper() { LOGFILE=${2}
# Pack BackUp and Cloud BackUp
if [ $(date "+%d") == "01" ]; then
Packer ${1} ${__HDD_PACK_BACK__} ${__LOCAL_CLOUD_OD__}
else
Packer ${1} ${__HDD_PACK_BACK__}
fi
}
CleanOldTarBackup 1:SERVICE_NAME¶
CleanOldTarBackup() { backup_versions=$(ls -l \({__HDD_PACK_BACK__}/*\) | wc -l) if [ ${backup_versions} -gt 1 ]; then find \({__HDD_PACK_BACK__} -name "*\)" -mtime +6 -mtime -30 -exec rm {} \; reserve_vers=$(ls -l \({__HDD_PACK_BACK__}/*\)* | wc -l) if [ ${backup_versions} -ne ${reserve_vers} ]; then log "Delete Old Backup files......Done" fi fi }
main() { # Backup Personal Service Data for service in "\({!SERVICES[@]}" do { PersonalFileBackUper "\){SERVICES[\(service]%,*}" "\)" log "Archive ${service} OK." sleep 1
# CleanUp Old Backup
CleanOldTarBackup "${service}"
sleep 1
}
done
}
Calling main() funcion¶
main
## 4. 使用 Systemd 进行服务控制```
[Unit]
Description=Backup files automatically
Wants=network-online.target
After=network-online.target
[Service]
User=root
Group=root
WorkingDirectory=/home/$USER
Environment="HOMEDIR=/home/$USER"
Environment="HDD_BASE=/Path/To/SSD"
Environment="LOGPATH=/var/log/ArchiveBackUp"
ExecStart=/bin/bash /Path/To/Script/ArchiveBackUp.sh
[Install]
WantedBy=multi-user.target
参考文献[1].使用 Systemd 按时间段执行脚本¶
[2].Shell字符串截取