差分同期したい(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を利用できます。