差分同期したい(rsync)

$ rsync [OPTION]... SRC [SRC]... DEST
$ rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsyncはファイルの差分を検知し、更新されたファイルのみ同期できるコマンドです。 SSHに対応しておりローカルとリモートのファイルをやりとりすることもできます。

参考

rsyncを使ったバックアップの定型作業や、 リモート→ローカル→クラウドの2段階バックアップなどを簡単に設定・実行できるツールが欲しかったので、自作しました。 PyPIで公開しています。 よかったら使ってみてください。

ファイルを同期したい(-auvz)

// ローカル -> リモートにアップロード
$ rsync -auvz ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

// リモート -> ローカルにダウンロード
$ rsync -auvz [ユーザー名@]ホスト名:ディレクトリ名/ファイル名 ディレクトリ名/

// 複数ファイルをアップロード
$ rsync -auvz ファイル名1 ファイル名2 [ユーザー名@]ホスト名:ディレクトリ名/

// 複数ファイルをダウンロードは --include-from を利用(後述)

ファイルのパスを指定して、ローカルとリモートの間で同期できます。 -auvzは定番オプションの組み合わせです。 アップロードとダウンロードは、[ユーザー名@]ホスト名:の位置が転送元か転送先かで決まります。 コロンより前に付いていれば、そちらがリモート側です。

ディレクトリを同期したい(-auvz)

// ローカル -> リモートにアップロード
$ rsync -auvz ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/

// リモート -> ローカルにダウンロード
$ rsync -auvz [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/

ディレクトリを指定して、その中身を丸ごとローカルとリモートの間で同期できます。 アップロードとダウンロードの見分け方は、ファイルの同期と同じです。

ディレクトリ名の末尾に/(スラッシュ)をつけると、ディレクトリの中身だけが転送先の直下にコピーされます。 つけない場合は、ディレクトリ自体が転送先の中にコピーされ、1階層深くなります。 意図しない場所に展開されることがあるので、末尾のスラッシュの有無には注意が必要です。

--dry-runオプションを付けて、実際に転送される前に作業対象が合っているか事前に確認すると安全です。

オプションを除外したい(--no-オプション名)

// --no-perms
$ rsync -auvz --no-p ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

// --no-times
$ rsync -auvz --no-t ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

-auvzは定番のオプションです。 とりあえずこれをつけておけば、ほとんどのケースで問題ありません。 ただし、リモートサーバーのディレクトリ設定によってはパーミッション関係などで警告が表示される場合があります。 その場合、--no-permsや--no-timesを追加して回避できることもあります。

アーカイブしたい(-a / --archive)

$ rsync --archive ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--archive(-a)で、アーカイブモードで同期できます。 アーカイブモードは、-rlptgoDに相当します。 再帰的な同期(-r / --recursive)、 シンボリックリンク(-l / --link)、 パーミション(-p / --perms)、 タイムスタンプ(-t / --times)、 グループ(-g / --group)、 オーナー(-o / --owner)、 デバイス(-D / --devices)、 特殊ファイル(--special)を保ったまま同期できます。

差分したい(-u / --update)

$ rsync --update ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--update(-u)で、差分のあったファイルだけ更新できます。

詳細を表示したい(-v / --verbose)

$ rsync --verbose ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--verbose(-v)で、転送中の詳細なメッセージを表示できます。

転送速度をあげたい(-z / --compress)

$ rsync --compress ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--compress(-z)で、転送時にデータを圧縮できます。 転送速度をあげることができますが、CPU負荷が高くなる場合があります。

進捗を表示したい(--progress)

$ rsync --progress ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--progressで、転送中の進捗を表示できます。

チェックサムしたい(-c / --checksum)

$ rsync --checksum ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--checksum(-c)で、転送前にチェックサムを計算して、差分のあるファイルだけ更新できます。

更新箇所を確認したい(-i / --itemize-changes)

$ rsync --itemize-changes ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/

--itemize-changes(-i)で、転送後のサマリーを表示できます。

事前確認したい(-n / --dry-run)

// ローカル -> リモートにアップロード
$ rsync -auvz --dry-run ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/

// リモート -> ローカルにダウンロード
$ rsync -auvz --dry-run [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/

--dry-runオプションで、転送内容を事前に確認できます。 ディレクトリを同期したり、--deleteオプションしたりする場合に、事前確認することで失敗を減らせます。

完全に同期したい(--delete)

// ローカル -> リモートにアップロード
$ rsync -auvz --delete ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/

// リモート -> ローカルにダウンロード
$ rsync -auvz --delete [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/

通常の差分同期(--update)では、 手元のコンテンツを削除して再び同期しても、 サーバー側にデータが残ったままになります。

--deleteオプションで、ファイル削除の情報も含めて完全同期できます。 デフォルトだと、データは転送前に削除(--delete-before)されます。 他にも転送中に削除(--delete-during)、転送後に削除(--delete-after)のオプションがあります。

絞り込みたい(--include-from / --exclude-from)

// コンテンツを指定して同期
$ rsync -auvz --include-from=include.txt [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/

// コンテンツを除外して同期
$ rsync -auvz --exclude-from=exclude.txt ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/

--include-fromでホワイトリスト形式、 --exclude-fromでブラックリスト形式、 で同期するコンテンツを制御できます。

  • include.txtの例

dir1
dir2
  • exclude.txtの例

.git/
.gitignore
.env
.DS_Store
// 除外ファイルをひとつずつ指定
$ rsync -auvz --exclude=".DS_Store" --exclude=".env" ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/

--includeや--excludeでファイル名を直接指定できます。 ファイルが少ない場合はよいかもしれませんが、 最初からファイル形式を使うことをオススメします。

実行パスしたい(--rsync-path)

$ rsync -auvz --rsync-path="リモートサーバーのパス" ホスト名:ディレクトリ名 ローカルのディレクトリ名
$ rsync -auvz --rsync-path="~/.local/bin/rsync" ホスト名:ディレクトリ名 ローカルのディレクトリ名

--rsync-pathで実行パスを指定できます。

システム全体でrsyncdデーモンが起動していないリモートサーバーにはrsyncコマンドが入っていません。 そのような場合に、ユーザーが個人でビルド&インストールしたrsyncを利用できます。