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