macOSに標準で入っている/usr/bin/rsyncは、実体がopenrsyncである。--info=progress2や--append-verifyなど、rsync 3.x系のオプションの一部が使えない。Homebrewでrsync 3.xをインストールすると、これらのオプションを使えるようになる。

$ brew install rsync

インストールしたrsyncは、/opt/homebrew/bin/rsyncに置かれる。バージョンを確認する。

$ /opt/homebrew/bin/rsync --version | head -1
rsync  version 3.5.1  protocol version 33

実行例はmacOS 27.0.1、Apple Siliconのもの。Intel Macでは、インストール先が/usr/local/bin/rsyncになる。

標準のrsyncのバージョンを確認する

標準の/usr/bin/rsyncのバージョンを表示すると、openrsyncと表示される。

$ /usr/bin/rsync --version
openrsync: protocol version 29
rsync version 2.6.9 compatible

rsync 2.6.9互換の実装で、プロトコルのバージョンは29。Homebrewのrsyncは、プロトコルのバージョンが33。

どちらのrsyncが実行されるか確認する

type -aで、PATHから見つかるrsyncを、優先順に一覧する。

$ type -a rsync
rsync is /opt/homebrew/bin/rsync
rsync is /usr/bin/rsync

PATHでHomebrewのbinディレクトリが/usr/binより前にあれば、rsyncと入力するとHomebrewのrsyncを実行する。先頭が/usr/bin/rsyncのときは、PATHの設定を確認する。

$ echo $PATH | tr ':' '\n' | head -3
/opt/homebrew/bin
/opt/homebrew/sbin
/usr/bin

Homebrewの公式の手順では、~/.zprofileにeval "$(/opt/homebrew/bin/brew shellenv)"を追記して、PATHを設定する。

スクリプトではフルパスで指定する

cronやlaunchdから実行するスクリプトでは、PATHに/opt/homebrew/binを含まない環境もある。その場合、rsyncと書くと標準のrsyncが実行される。スクリプトの中では、フルパスで指定すると確実である。

RSYNC=/opt/homebrew/bin/rsync
"$RSYNC" -rlt src/ dst/

標準のrsyncで使えないオプション

標準の/usr/bin/rsyncとHomebrewのrsyncで、よく使うオプションの動作を比較した。

オプション標準(openrsync)Homebrew(3.5.1)
-a、-r、-t、-n使える使える
--partial、--timeout、--size-only使える使える
--exclude、--delete-after、--bwlimit使える使える
-c(--checksum)、--stats使える使える
--itemize-changes(-i)使える使える
--info=stats1、--info=stats2使えない使える
--info=progress2使えない使える
--append-verify使えない使える
-s(--protect-args)使えない使える

標準のrsyncで使えないオプションを指定すると、エラーになる。

$ /usr/bin/rsync -r --info=progress2 src/ dst/
rsync: unrecognized option `--info=progress2'
$ echo $?
1

--info=progress2は、転送全体の進捗を1行で表示するオプションである。大量のファイルを転送するとき、全体の進み具合を確認できる。

$ /opt/homebrew/bin/rsync -r --info=progress2 src/ dst/
          2  50%    0.00kB/s    0:00:00

--itemize-changesの出力が異なる

--itemize-changesは、どちらのrsyncでも使えるが、出力の桁数が異なる。新規ファイルの転送を表す出力で、標準のrsyncは>f+++++++、Homebrewのrsyncは>f+++++++++と表示する。

$ /usr/bin/rsync -rn -i src/ dst/
>f+++++++ a.txt
$ /opt/homebrew/bin/rsync -rn -i src/ dst/
>f+++++++++ a.txt

出力をgrep '^>f'のように、先頭の文字だけで絞り込むスクリプトは、どちらでも動作する。桁数を前提にした正規表現は、rsyncを置き換えたときに動作しなくなる。