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を置き換えたときに動作しなくなる。
