linux中读取外部文件列表备份文件/目录并记入日志

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/bash
# 脚本功能:读取外部列表备份文件/目录,并记录详细日志

ip=$(hostname -I | awk '{print $1}')
LIST_FILE="backup_list.txt"
DEST_DIR="/home/backup/$ip/$(date +%Y%m%d)_bak"
LOG_DIR="/var/log/backuplogs"
LOG_FILE="${LOG_DIR}/backup_$(date +%Y%m%d).log"

#切换到脚本执行目录
cd /usr/local/bin

# 创建日志目录
mkdir -p "$LOG_DIR" "$DEST_DIR"

# 日志记录函数
log() {
local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "[${timestamp}] $1" | tee -a "$LOG_FILE"
}

# 主备份逻辑
log "===== 开始备份任务 ====="
log "备份目标目录: $DEST_DIR"

while IFS= read -r source_path; do
# 跳过空行和注释行
[[ -z "$source_path" || "$source_path" == \#* ]] && continue

# 检查源路径是否存在
if [ ! -e "$source_path" ]; then
log "警告: 路径不存在 [跳过] -> $source_path"
continue
fi
# 生成目标路径
relative_path=$(realpath --relative-to="$(dirname "$source_path")" "$source_path")
target_path="${DEST_DIR}/${relative_path}"

# 执行复制操作
if cp -rv --preserve=all "$source_path" "$target_path" 2>&1 | tee -a "$LOG_FILE"; then
log "成功: 备份完成 -> $source_path"
else
log "错误: 备份失败 -> $source_path"
fi

done < "$LIST_FILE"

log "===== 备份任务结束 ====="
echo "操作日志已保存至: $LOG_FILE"

文件列表举例:

1
touch backup_list.txt

内容如下:

1
2
3
4
5
/etc

/home/www

/var/log

其中注释行不被读取