rsyncで「._*」が消えないのはオプションが抜けているというよりも、「rsyncの仕様の罠」、「Mac特有の挙動」の2つが原因で、意図しない挙動になっています。
「大量に同期されてしまう(防げない)」かつ「サーバー側から消えない」という状態を100%解決するための3つの原因と、修正版のコマンドを解説します。
原因1:--exclude すると --delete で消えない(rsyncの仕様)
これが「サーバー側から ._* が消えない」最大の理由です。
rsyncの仕様として、--exclude で除外したファイルは「この同期処理の宇宙には最初から存在しないもの(管理対象外)」として扱われます。
そのため、過去に一度同期されてサーバー側に残ってしまった ._* ファイルは、--exclude '._*' を指定した瞬間にrsyncのチェック対象から外れるため、--delete を付けていても削除されずに残り続けてしまいます。
🛠 対策:--delete-excluded を追加する
「除外設定(exclude)しているファイルであっても、サーバー側に存在してローカルにないなら強制削除する」という専用オプションを追加します。
原因2:MacのOSが転送時に ._* を自動生成している
「ローカルのフォルダ内には ._* なんて無いのに、なぜか同期されてしまう」という場合はこれが原因です。
MacからLinuxサーバーなどへファイルを転送する際、MacのOS(ファイルシステム)は、ファイルが持つメタデータ(拡張属性やアイコン情報など)を保持しようとして、転送する瞬間にバックグラウンドで ._ファイル名 という隠しファイルを自動生成して送りつける挙動をします。
rsyncが「同期するファイルリスト」を作った後にOSが勝手に割り込んで生成するため、--exclude のフィルターをすり抜けて同期されてしまいます。
🛠 対策:環境変数 COPYFILE_DISABLE=1 を先頭につける
コマンドの先頭にこれを記述することで、MacのOSに対して「転送時に余計なメタデータファイル(._*)を自動生成するな」と命令を出すことができます。
💡 これらすべてを解決する「完全版コマンド」
上記2つの対策をすべて盛り込み、全角スペースを排除した正しいコマンドがこちらです。こちらをコピーして実行してみてください。
COPYFILE_DISABLE=1 /opt/homebrew/bin/rsync \
-rvlD \
--exclude '.DS_Store' \
--exclude '._*' \
--delete \
--delete-excluded \
/ローカルのコピー元/ user@サーバーIP:/リモートのコピー先/
変更・追加したポイント
- 先頭に
COPYFILE_DISABLE=1を付与(Macの自動生成を阻止) - オプションに
--delete-excludedを追加(サーバー側に残った._*や.DS_Storeを強制一括削除)

コメント