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

TIPS
TIPS

rsyncで「._*」が消えないのはオプションが抜けているというよりも、「rsyncの仕様の罠」、「Mac特有の挙動」の2つが原因で、意図しない挙動になっています。

「大量に同期されてしまう(防げない)」かつ「サーバー側から消えない」という状態を100%解決するための3つの原因と、修正版のコマンドを解説します。

原因1:--exclude すると --delete で消えない(rsyncの仕様)

これが「サーバー側から ._* が消えない」最大の理由です。

rsyncの仕様として、--exclude で除外したファイルは「この同期処理の宇宙には最初から存在しないもの(管理対象外)」として扱われます。

そのため、過去に一度同期されてサーバー側に残ってしまった ._* ファイルは、--exclude '._*' を指定した瞬間にrsyncのチェック対象から外れるため、--delete を付けていても削除されずに残り続けてしまいます。

🛠 対策:--delete-excluded を追加する

「除外設定(exclude)しているファイルであっても、サーバー側に存在してローカルにないなら強制削除する」という専用オプションを追加します。

[rsync]「._*」ファイルの対応
[Mac]「._」ファイル作成無効化
Macで自動生成される「._」ファイルの作成を無効化する方法を解説。無効化してもMac本体に不具合が起きない理由や、カラータグ等の消失といったデメリット、サーバー運用におけるメリット、ターミナルやFinderでの設定手順を紹介します。

原因2:MacのOSが転送時に ._* を自動生成している

「ローカルのフォルダ内には ._* なんて無いのに、なぜか同期されてしまう」という場合はこれが原因です。

MacからLinuxサーバーなどへファイルを転送する際、MacのOS(ファイルシステム)は、ファイルが持つメタデータ(拡張属性やアイコン情報など)を保持しようとして、転送する瞬間にバックグラウンドで ._ファイル名 という隠しファイルを自動生成して送りつける挙動をします。

rsyncが「同期するファイルリスト」を作った後にOSが勝手に割り込んで生成するため、--exclude のフィルターをすり抜けて同期されてしまいます。

🛠 対策:環境変数 COPYFILE_DISABLE=1 を先頭につける

コマンドの先頭にこれを記述することで、MacのOSに対して「転送時に余計なメタデータファイル(._*)を自動生成するな」と命令を出すことができます。

[rsync]「._*」ファイルの対応
ファイルフォーマットと対応OS
Windows、Mac、Linuxにおける主要ファイルシステム(exFAT、NTFS、APFS等)の互換性と特徴を解説。複数OS間でデータを共有・移行する際、なぜexFATが最適なのか、各フォーマットのメリット・デメリットを交えて紹介します。

💡 これらすべてを解決する「完全版コマンド」

上記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 を強制一括削除)

Q よくある質問 (FAQ)
Q. なぜ--excludeを指定しているのにサーバー側の「._*」ファイルが削除されないのですか?
A.
rsyncの仕様上、--excludeで除外されたファイルは同期の管理対象外となるため、--deleteを指定しても削除されません。解決には--delete-excludedオプションが必要です。
Q. ローカルに存在しない「._*」ファイルが同期先で勝手に生成されるのはなぜですか?
A.
MacのOSが転送時にメタデータを保持するために、バックグラウンドで「._*」ファイルを自動生成して転送するためです。環境変数 COPYFILE_DISABLE=1 を付与することで生成を防げます。

コメント

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