跳转至

--- 标签: - 壳类别: - 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字符串截取