[rsync]「._*」ファイルの対応

TIPS

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:/リモートのコピー先/

変更・追加したポイント

  1. 先頭に COPYFILE_DISABLE=1 を付与(Macの自動生成を阻止)
  2. オプションに --delete-excluded を追加(サーバー側に残った ._*.DS_Store を強制一括削除)

コメント

タイトルとURLをコピーしました