直接用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 artxards"> <div class="artcardd flexRow"> <a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill7751" title="macOS Notes"><img src="https://img.php.cn/upload/skill/000/000/081/179168053655621.jpg" alt="macOS Notes" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a> <div class="aritcle_card_info flexColumn"> <a rel="nofollow" href="/xiazai/skill7751" title="macOS Notes" class="overflowclass">macOS Notes</a> <p class="overflowclass">通过 AppleScript 创建、读取、搜索及管理 macOS 备忘录。适用于用户要求记笔记、记录事项、保存想法、创建会议记录等场景。</p> </div> <a rel="nofollow" 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/"</p>
- 保存后赋予执行权限:
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"?><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></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</p>- 这样脚本会在硬盘未连接或空间不足时直接退出,不覆盖旧备份也不报错中断










