Maintain Finder's file lock during rsync?

I'm using rsync to keep two drives in sync. I use the --archive flag which is meant to maintain permissions. However, files which are "locked" in Finder do not show as locked after the rsync operation is complete. How can I replicate the Finder lock during rsync?


The version of rsync that macOS provides is about 15-years old and doesn't handle preserving file flags supported by chflags (e.g. UF_IMMUTABLE or "Locked" as set with chflags uchg).

Current versions of rsync have:

--fileflags This option causes rsync to update the file-flags to be the same as the source files and directories (if your OS supports the chflags(2) system call).

Install Homebrew and update rsync to a modern version with:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
brew install rsync

If you are doing a remote transfer, both the sending and receiving hosts must support --fileflags, obviously.

However, if the necessary version of rsync is not in the default remote-shell's PATH (i.e. /usr/bin:/bin:/usr/sbin:/sbin), the path to the requisite version must be specified. This is done with the --rsync-path=PROGRAM option.

For example:

rsync --fileflags -avz ${HOME}/ remotehost:${HOME}

errors when the remote host's default rsync doesn't support --fileflags:

rsync: on remote machine: --fileflags: unknown option

rsync error: syntax or usage error (code 1) at /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/rsync/rsync-54.120.1/rsync/main.c(1337) [server=2.6.9]

rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(228) [sender=3.2.3]

Assuming the requisite rsync is installed in /usr/local/bin, this is resolved with:

rsync --rsync-path=/usr/local/bin/rsync --fileflags -avz ${HOME}/ remotehost:${HOME}