在驱动器之间备份和同步文件和目录对许多用户来说是非常遍及的运用状况。在这个快速教程中,你将学习怎么运用launchdrsync在 macOS 的不同卷之间同步文件。

问题

在macOS的两个驱动器之间双向同步一个(KeePass)文件。

解决办法

  • 注意两个当地的文件变化
  • 在不同地址之间同步文件,只在源文件比方针文件新的状况下进行更新。

实施

调查文件的变化launchd

监视文件或目录变化的最简略办法是运用launchdlaunchd是一个 macOS 服务,用于发动、中止和管理看护进程、应用程序、进程和脚本。launchd运用属性列表*(plist*)文件来装备程序的运转办法。在这种状况下,咱们想在文件或目录发生变化时运转程序。

该装备如下:

<?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>file.sync</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/kolorobot/.scripts/file.sync.sh</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Volumes/Kolorodisk/My Files/KeePass/my-db.kdbx</string>
        <string>/Users/kolorobot/KeePass/my-db.kdbx</string>
    </array>
    <key>StandardErrorPath</key>
    <string>/tmp/file.sync.err</string>
    <key>StandardOutPath</key>
    <string>/tmp/file.sync.out</string>
</dict>
</plist>

上述装备能够读作以下内容:

  • 工作的名称是file.sync
  • 要运转的程序是/Users/kolorobot/.scripts/file.sync.sh
  • 当两个文件有变化时,要运转该程序。
    • /Volumes/Kolorodisk/My Files/KeePass/my-db.kdbx
    • /Users/kolorobot/KeePass/my-db.kdbx
  • 规范输出被重定向到/tmp/file.sync.out
  • 规范过错被重定向到/tmp/file.sync.err

注意在路径中没有运用转义字符spacebar

代表当前登录的用户履行该作业。

launchd能够作为体系用户或当前登录的用户履行作业。咱们将运用第二种状况,为此:

  • 将文件存储在~/Library/LaunchAgents/file.sync.plist
  • 在终端,履行launchctl load -w ~/Library/LaunchAgents/file.sync.plist 来加载定义。

要卸载定义,请运转。launchctl unload -w ~/Library/LaunchAgents/file.sync.plist

同步文件

为了同步文件,咱们将运用rsync ,但它将经过前面说到的办法发动。file.sync.sh

这个文件的内容:

#!/bin/sh
SRC="/Volumes/Kolorodisk/My Files/KeePass/my-db.kdbx"
DST="/Users/kolorobot/KeePass/my-db.kdbx"
if [ -d  /Volumes/Kolorodisk ]
then
    echo "---- Sync ----"
    rsync -rtuv "$SRC" "$DST"
    rsync -rtuv "$DST" "$SRC"
    /usr/bin/osascript -e 'display notification "File sync complete!" with title "Sync"'
fi
  • ~/.scripts 中创立file.sync.sh 并使其可履行。
  • 粘贴上述内容,并经过履行它来验证脚本是否工作。

这个脚本是做什么的?

  • 它检查外部驱动器是否被安装
  • 它运用rsync两个方向上同步该文件。只有当源文件方针文件新时,文件才会被仿制。
  • 它显示体系告诉

全磁盘拜访bin/sh

随着macOS Catalina发动看护程序和发动署理引入了新的用户隐私保护(https://developer.apple.com/documentation/macos_release_notes/macos_catalina_10_15_release_notes),简而言之,由launchd运转的程序需要被授权拜访外部驱动器。如果操作不妥,你可能会看到以下过错。

sync: send_files failed to open "/Volumes/Kolorodisk/My Files/KeePass/my-db.kdbx": Operation not permitted (1)
rsync error: some files could not be transferred (code 23) at /BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-54/rsync/main.c(996) [sender=2.6.9]

解决这个问题的最简略办法是在bin/sh ,给予全盘拜访权,System Preferences > Security & Privacy > Privacy > Full Disk Access

测验解决方案

当所有设置完成后,你能够经过对同步文件进行修改来测验该解决方案。

拜见

  • macOS:(Java)开发人员的根本东西