直接用Shell脚本实现移动硬盘备份,核心是复制+时间标记+安全判断:先确认硬盘挂载与写权限,再用rsync增量备份并加时间戳,最后通过launchd定时执行,并在脚本开头校验挂载状态和剩余空间。
直接用 shell 脚本把指定目录备份到移动硬盘,核心是“复制 + 时间标记 + 安全判断”,不需要第三方工具,系统自带 rsync 就足够可靠。
确认移动硬盘已正确挂载并可写
插入移动硬盘后,先检查它是否被系统识别且有写入权限:
- 打开终端,运行
ls /Volumes,确认你的硬盘名称(比如叫BackupDisk)出现在列表里 - 测试能否创建文件:
touch /Volumes/BackupDisk/test.tmp && rm /Volumes/BackupDisk/test.tmp,没报错说明可写 - 如果提示“Permission denied”,右键硬盘 → “显示简介” → 检查“共享与权限”里你的账户是否有“读与写”
用 rsync 写一个带时间戳的增量备份脚本
rsync 比 cp 更适合备份:跳过未改动的文件、保留权限和符号链接、支持排除规则。下面是一个实用模板:
- 新建脚本文件,例如
~/backup.sh,内容如下:
#!/bin/bash
SOURCE="/Users/yourname/Documents/project"
DEST="/Volumes/BackupDisk/Backups"
DATE=$(date +"%Y%m%d_%H%M")
<h1>确保目标路径存在</h1><p>mkdir -p "$DEST"</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill7751" title="macOS Notes"><img
src="https://img.php.cn/upload/skill/000/000/081/179168053655621.jpg" alt="macOS Notes" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill7751" title="macOS Notes">macOS Notes</a>
<p>通过 AppleScript 创建、读取、搜索及管理 macOS 备忘录。适用于用户要求记笔记、记录事项、保存想法、创建会议记录等场景。</p>
</div>
<a href="/xiazai/skill7751" title="macOS Notes" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>执行同步,--delete 保持目标与源完全一致,-a 保留属性,--exclude 排除临时文件</h1><p>rsync -av --delete \
--exclude='*.tmp' \
--exclude='.DS<em>Store' \
"$SOURCE/" "$DEST/project</em>$DATE/"- 保存后赋予执行权限:
chmod +x ~/backup.sh - 运行一次测试:
~/backup.sh,观察/Volumes/BackupDisk/Backups/下是否生成带时间戳的新文件夹
设置定时自动执行(每天凌晨2点)
用系统自带的 launchd 实现静默定时运行,比 crontab 更兼容新版 macOS:
- 新建配置文件:
~/Library/LaunchAgents/com.user.backup.plist - 内容示例(注意把
UserName替换为你自己的用户名):
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>Label</key><string>com.user.backup</string><key>ProgramArguments</key><array><string>/Users/UserName/backup.sh</string></array><key>StartCalendarInterval</key><dict><key>Hour</key><integer>2</integer><key>Minute</key><integer>0</integer></dict><key>RunAtLoad</key><false/></dict></plist>
- 加载任务:
launchctl load ~/Library/LaunchAgents/com.user.backup.plist - 立即试运行(不等凌晨):
launchctl start com.user.backup - 查看日志是否成功:
log show --predicate 'subsystem == "com.user.backup"' --last 1h
加一层安全保护:备份前校验硬盘状态
避免移动硬盘意外断开导致备份中断或损坏,可在脚本开头加入检测逻辑:
- 在
backup.sh开头插入:
# 检查硬盘是否挂载且空间充足(至少预留5GB)
if ! mount | grep -q "/Volumes/BackupDisk"; then
echo "ERROR: Backup disk not mounted" >&2
exit 1
fi
<p>AVAIL=$(df -k "/Volumes/BackupDisk" | tail -1 | awk '{print $4}')
if [ "$AVAIL" -lt 5242880 ]; then # 小于5GB
echo "ERROR: Less than 5GB free on backup disk" >&2
exit 1
fi- 这样脚本会在硬盘未连接或空间不足时直接退出,不覆盖旧备份也不报错中断

















