自动备份 Mac 电脑的笔记文件

在日常使用 Mac 的过程中,我们经常会记录一些笔记或者重要的文件。这些笔记可能包含了工作中的灵感、学习中的重点和生活中的琐事。因此,定期备份这些笔记显得尤为重要。本文将列举几种简单的方法并从中选择最合适的方法,即使你是编程小白,也能轻松帮助你自动备份Mac的笔记文件。

使用 iCloud 自带的备份

虽然 iCloud 有默认的自动备份,但是缺点也比较明显。

image-20240805101118179

默认的备份只能备份 桌面文稿 两个目录,不能满足自定义。

而且开启这个 桌面与文稿文件夹 会将桌面上的文件也会同步,但是大多数场景下,这并不是我们希望的。

使用 Automator 自动备份

虽然使用 Automator 也能实现自动备份,并且提供了很高的自定义和自动化功能,可以实现许多个性化的需求。

但是使用 Automator 操作步骤相对来说比较多,过程相对复杂,对新手不友好。

下面是使用 Automator 编写自动备份程序的大致步骤:

  1. 打开Automator,选择“新建文稿”,选择“应用程序”。

  2. 在左侧栏中选择“文件和文件夹”,然后拖动“复制Finder项目”到右侧的工作流程区域。

  3. 设置源文件夹为你的笔记文件夹,目标文件夹为你的备份位置。

  4. 保存该Automator应用,并设置定时任务或手动运行以实现定期备份。

有基础的同学可以自行探索,下面我们讨论使用脚本实现自动定时同步笔记的方案。

使用 shell 脚本 + 定时任务

shell 脚本:

要实现与 iCloud 云盘的文件传输我们要使用一个非常重要而且在 macOS 中也很流行的工具 rsync

rsync 是一个用于在计算机之间同步文件和目录的工具,以下是 rsync 在 macOS 中的一些主要特点:

  1. 增量同步:

    • rsync 只复制自上次同步以来更改的文件,这大大减少了后续的文件数据传输量和时间,这也是 rsync 最重要的功能之一。
  2. 远程同步:

    • rsync 支持通过 SSH 协议进行远程同步,这意味着可以安全地在网络上进行文件传输,包括与远程服务器进行文件同步。
  3. 保留文件属性:

    • rsync 可以保留文件的权限、时间戳、符号链接和其他属性,确保目标目录中的文件与源目录中的文件完全一致。

    符号链接:实质上是一个存放目标文件路径的特殊文件,拥有自己的 inode 和文件属性。

  4. 排除和包含:

    • rsync 提供强大的排除和包含选项,可以根据特定的模式排除或包含文件和目录,比如 macOS 中用于存储目录的自定义属性和元数据的文件 .DS_Store
  5. 压缩传输:

    • 可以使用 -z 选项启用压缩传输,减少网络带宽占用,提高文件传输的效率。
  6. 断点续传:

    • rsync 支持断点续传功能,可以在传输中断后继续传输,避免重新开始,大文件传输必须。
  7. 本地和远程同步:

    • 可以在本地同步两个目录,也可以在本地和远程之间进行同步,云或者是服务器。
  8. 基于校验和的同步:

    • rsync 使用校验和算法来检测文件的差异,而不是仅仅依赖于文件的时间戳和大小。

话不多说,直接上代码:

sh
#!/bin/bash

# 日志文件路径
LOGFILE="/Users/hersan/shell/log/sync_note_to_icloud.log"

# 设置UTF-8编码
export LANG=en_US.UTF-8

# 记录开始时间
echo "$(date): 开始同步" >> "$LOGFILE"

# 防止电脑进入睡眠(120s -> 2分钟)
caffeinate -s -t 120 &

# 要同步的本地目录
LOCAL_DIR="/Users/hersan/笔记" # 这里改成你想要同步的本地目录

# iCloud 目录
ICLOUD_DIR="$HOME/Library/Mobile Documents/com~apple~CloudDocs"

# iCloud 笔记目录
ICLOUD_NOTE_DIR="$ICLOUD_DIR/笔记"

# 确保 iCloud 笔记目录已下载到本地
if [ ! -d "$ICLOUD_NOTE_DIR" ]; then
  echo "$(date): iCloud 笔记目录未找到,将同步本地笔记目录到 iCloud" >> "$LOGFILE"
  mkdir -p "$ICLOUD_NOTE_DIR"
fi

# 删除目标目录中的 .DS_Store 文件
/usr/bin/find "$ICLOUD_NOTE_DIR" -name ".DS_Store" -type f -delete

# 使用 rsync 同步目录,并排除 .DS_Store 文件
# 将本地笔记目录同步到 iCloud 笔记目录,并会删除目标目录中在源目录中不存在的文件
rsync -av --delete --exclude=".DS_Store" "$LOCAL_DIR/" "$ICLOUD_NOTE_DIR" >> "$LOGFILE" 2>&1

# 记录结束时间
echo "$(date): 同步完成" >> "$LOGFILE"

使用 cron 创建定时任务

  • 在终端中输入以下命令,打开当前用户的 crontab 文件:

    • crontab -e
    • 如果是第一次使用 crontab,它可能会提示你选择一个文本编辑器,选择你熟悉的即可(例如 vim 或 nano)
  • 在 crontab 文件中,添加定时任务,例如:

    • */30 * * * * /Users/hersan/shell/sync_note_to_icloud.sh
    • 后面的路径换成你的 shell 脚本的绝对路径
  • 附上 crontab 文件的编写格式:

    sh
    * * * * * <command>
    - - - - -
    | | | | |
    | | | | +---- 星期几 (0 - 7) (0 7 是星期天)
    | | | +------ 月份 (1 - 12)
    | | +-------- 每月的第几天 (1 - 31)
    | +---------- 小时 (0 - 23)
    +------------ 分钟 (0 - 59)
    • 例如,你想每天早上 9:00 执行一次脚本:
      • 0 9 * * * /Users/hersan/shell/sync_note_to_icloud.sh
    • 如果你希望每隔 5 分钟执行一次脚本:
      • */5 * * * * /Users/hersan/shell/sync_note_to_icloud.sh

写在最后

如果是同步笔记或者日常中的 office 办公文件等使用本文的方法足够,大文件例如视频等请考虑压缩传输、分片同步和断点续传

album
profileHersan

热爱编程,开源社区活跃参与者

3文章
0标签
0分类