差分同期したい(rsync

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

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

ファイルを同期したい

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

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

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

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

ファイルのパスを同期できます。

ディレクトリを同期したい

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

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

ディレクトリを指定して、その中身を丸ごと同期できます。 ディレクトリ名の末尾に/(スラッシュ)をつけるか、つけないか、同期される内容が変わるので注意が必要です。 --dry-runオプションで作業対象が合っているか事前に確認するとよいです。

定番オプションしたい(-auvz

-auvzが定番オプションです。 とりあえずこれをつけましょう。

オプションの内容は

  • -a / --archive(アーカイブモード)

  • -u / --update(更新があったファイルを同期)

  • -v / --verbose(メッセージ出力)

  • -z / --compress(転送時にデータを圧縮)

です。

アーカイブモードは-rlptgoDに相当し、

  • -r / --recursive(再帰的に同期)

  • -l / --links(シンボリックリンクを保ったまま)

  • -p / --perms(パーミションを保ったまま)

  • -t / --times(時刻を保ったまま)

  • -g / --group(グループを保ったまま)

  • -o / --owner(オーナーを保ったまま)

  • -D--devices + --special

    • --devices(デバイスを保ったまま)

    • --special(特殊ファイルを保ったまま)

です。

また、--no-オプション名で、アーカイブモードからそのオプションを除外できます。

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

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

リモートサーバーのディレクトリ設定によってはwarningがでる場合があります。 その場合、--no-perms--no-timesを追加して回避できることもあります。

事前確認したい(-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を利用できます。