这篇博客介绍了使用 rsync 命令进行照片备份的操作指南,包括日常备份、完整性校验、备份策略建议以及一键备份脚本。
照片备份操作指南
一、日常备份(推荐)
使用 rsync 命令,只同步新增/变化的文件,已有文件不会重复拷贝。
rsync -avh --progress \
--exclude='.DS_Store' \
--exclude='._*' \
--exclude='.fseventsd/' \
"/Volumes/源盘名称/照片/" \
"/Volumes/备份盘名称/备份目录/照片/"
参数说明
| 参数 | 作用 |
|---|---|
-a |
归档模式(保留权限、时间戳、符号链接) |
-v |
显示详细过程 |
-h |
人类可读的大小显示 |
--progress |
显示实时传输进度 |
--exclude |
排除不需要的文件 |
注意事项
- 源路径末尾的
/不能省,表示”复制目录里的内容” - 中途可以
Ctrl+C中断,再次运行会从断点继续 - 已存在且相同的文件会自动跳过,不会重复传输
二、验证备份完整性
快速检查(文件存在性对比)
只对比两边文件名,几秒钟出结果:
SRC="/Volumes/源盘名称/照片"
DST="/Volumes/备份盘名称/备份目录/照片"
TMP="/tmp/photo_check"
mkdir -p "$TMP"
# 扫描两边文件列表
find "$SRC" -type f ! -name '._*' ! -name '.DS_Store' ! -path '*/.fseventsd/*' | sed "s|^$SRC/||" | sort > "$TMP/src.txt"
find "$DST" -type f ! -name '._*' ! -name '.DS_Store' ! -path '*/.fseventsd/*' | sed "s|^$DST/||" | sort > "$TMP/dst.txt"
# 对比
echo "源文件数: $(wc -l < $TMP/src.txt | tr -d ' ')"
echo "备份文件数: $(wc -l < $TMP/dst.txt | tr -d ' ')"
echo "缺失文件数: $(comm -23 $TMP/src.txt $TMP/dst.txt | wc -l | tr -d ' ')"
echo "多余文件数: $(comm -13 $TMP/src.txt $TMP/dst.txt | wc -l | tr -d ' ')"
如果缺失文件数 > 0,重新运行第一节的 rsync 命令即可补全。
深度校验(MD5 校验,可选)
对文件内容做 MD5 校验,确认没有损坏。注意:速度慢,适合定期抽检,不建议每次都做。
# 对两边共有文件计算 MD5 并对比
join -t'|' -1 2 -2 2 \
<(while IFS='|' read -r size path; do
md5 -q "$SRC/${path#./}" 2>/dev/null | tr -d '\n'
echo "|$path"
done < src_list.txt | sort -t'|' -k2) \
<(while IFS='|' read -r size path; do
md5 -q "$DST/${path#./}" 2>/dev/null | tr -d '\n'
echo "|$path"
done < dst_list.txt | sort -t'|' -k2) | \
awk -F'|' '{ if ($2 != $3) print "MD5不匹配: "$1 }'
三、备份策略建议
频率
| 场景 | 建议频率 |
|---|---|
| 日常使用 | 每周 1 次 |
| 大量导入新照片后 | 当天立即备份 |
| 重要活动照片(旅行、婚礼等) | 拍完立即备份 |
3-2-1 原则(最佳实践)
- 3 份数据副本(原始 + 2 份备份)
- 2 种不同存储介质(硬盘 + U 盘 / 硬盘 + 云)
- 1 份异地存放(云端或其他地点)
建议:
- 增加一份云端备份(如 iCloud、百度网盘、阿里云盘)
- 或第三块物理硬盘放在不同地点
四、常见问题
Q: rsync 中断了怎么办?
A: 重新运行同样的命令即可,rsync 会自动从断点继续。
Q: 怎么知道备份完了没?
A: 运行完 rsync 后,再运行第二节的快速检查命令,缺失文件数为 0 就是完整的。
Q: 源目录删了文件,备份里还留着?
A: 默认 rsync 只增不删。如果想让备份和源目录完全一致(源删了备份也删),加上 --delete 参数:
rsync -avh --progress --delete \
--exclude='.DS_Store' \
--exclude='._*' \
"/Volumes/源盘名称/照片/" \
"/Volumes/备份盘名称/备份目录/照片/"
⚠️ 慎用 --delete,先确认源目录没问题再加。
Q: 硬盘名字变了怎么办?
A: 修改命令里的路径即可。可以在 Finder 中右键硬盘 → 显示简介,查看或修改硬盘名称。
Q: 备份速度慢?
A:
- 用 USB 3.0/Type-C 接口
- 第一次备份会慢(全量),之后很快(只传增量)
- 大文件多的话耐心等待,正常现象
五、一键脚本(可选)
把下面的内容保存为 backup_photos.sh,修改前两行的路径为你自己的,以后双击或在终端运行 bash backup_photos.sh 即可。
#!/bin/bash
SRC="/Volumes/源盘名称/照片"
DST="/Volumes/备份盘名称/备份目录/照片"
if [ ! -d "$SRC" ]; then
echo "❌ 源目录不存在: $SRC"
exit 1
fi
if [ ! -d "$DST" ]; then
echo "❌ 备份目录不存在: $DST"
exit 1
fi
echo "🚀 开始备份照片..."
echo "源: $SRC"
echo "目标: $DST"
echo ""
rsync -avh --progress \
--exclude='.DS_Store' \
--exclude='._*' \
--exclude='.fseventsd/' \
"$SRC/" "$DST/"
if [ $? -eq 0 ]; then
echo ""
echo "✅ 备份完成!"
else
echo ""
echo "❌ 备份过程中出现错误,请检查后重试"
exit 1
fi
保存后执行 chmod +x backup_photos.sh 赋予执行权限。