コンテンツにスキップ

rsync でフォルダを同期

[質問]

WSLでフォルダをコピーするとき、新しく作られたファイルと、更新されたファイルだけコピーする方法はありますか。

[回答] Gemini

WSL(Linux)で「差分だけをコピーする」なら、cp よりも圧倒的に rsync というコマンドが便利で強力です。

rsync は、コピー元とコピー先を比較して、新しく作られたファイル内容が更新されたファイルだけを賢く判別して転送してくれます。


1. 推奨されるコマンド

以下のコマンドを使えば、目的の「差分コピー」が実現できます。

rsync -av --update /path/to/foo/ ~/bar/

オプションの解説

  • -a (archive): ディレクトリ構造、権限(パーミッション)、タイムスタンプをそのまま維持します(これ一つで -r など複数の役割を兼ねます)。
  • -v (verbose): どのファイルがコピーされているかを表示します。
  • --update (-u): これが重要です。 コピー先の方が新しいファイルがある場合、それを上書きせずにスキップします。
  • パス末尾の / (スラッシュ):
  • foo/(末尾あり): fooの中身をコピー。
  • foo (末尾なし): fooディレクトリ自体をコピー。

2. もっと便利に使いこなすテクニック

削除されたファイルも同期させる (--delete)

コピー元で削除されたファイルを、コピー先からも消して「完全に中身を一致させたい」場合はこのオプションを付けます。

rsync -av --delete /path/to/foo/ ~/bar/

実行前に「何がコピーされるか」確認する (--dry-run)

大事なデータを扱うとき、いきなり実行するのが怖い場合は、このオプションを付けると「実際にはコピーせず、何が行われるかだけ」を表示してくれます。

rsync -av --update --dry-run /path/to/foo/ ~/bar/

3. なぜ cp ではなく rsync なのか?

一応 cp にも -u オプションがありますが、rsync が選ばれるのには理由があります。

機能 cp -u rsync -au
差分検知 タイムスタンプのみ サイズや内容(チェックサム)も可能
転送効率 ファイルを丸ごと上書き ファイル内の変更箇所だけ送ることも可能
ネットワーク ローカルのみ リモートサーバー間でも使用可能
詳細設定 少ない 非常に豊富(特定のファイル除外など)

4. 応用:特定のファイルを除外してコピー

例えば、.git フォルダや __pycache__ などの不要なデータを除外して差分コピーしたい場合はこう書きます。

rsync -av --update --exclude='.git' --exclude='__pycache__' /path/to/foo/ ~/bar/

これで、バックアップや環境の同期が劇的に速くなります!

次は、「rsyncを使って定期的に自動バックアップを取る方法」や、「特定の拡張子(.pyなど)だけを抽出してコピーする方法」などについてお伝えしましょうか?