# 差分同期したい(`rsync`) ```console $ rsync [OPTION]... SRC [SRC]... DEST $ rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST ``` `rsync`はファイルの差分を検知し、更新されたファイルのみ同期できるコマンドです。 SSHに対応しておりローカルとリモートのファイルをやりとりすることもできます。 ## ファイルを同期したい ```console // ローカル -> リモートにアップロード $ rsync -auvz ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/ // リモート -> ローカルにダウンロード $ rsync -auvz [ユーザー名@]ホスト名:ディレクトリ名/ファイル名 ディレクトリ名/ // 複数ファイルをアップロード $ rsync -auvz ファイル名1 ファイル名2 [ユーザー名@]ホスト名:ディレクトリ名/ // 複数ファイルをダウンロードは --include-from を利用(後述) ``` ファイルのパスを同期できます。 ## ディレクトリを同期したい ```console // ローカル -> リモートにアップロード $ 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-オプション名`で、アーカイブモードからそのオプションを除外できます。 ```console // --no-perms $ rsync -auvz --no-p ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/ // --no-times $ rsync -auvz --no-t ファイル名 [ユーザー名@]ホスト名:ディレクトリ名/ ``` リモートサーバーのディレクトリ設定によってはwarningがでる場合があります。 その場合、`--no-perms`や`--no-times`を追加して回避できることもあります。 ## 事前確認したい(`-n` / `--dry-run`) ```console // ローカル -> リモートにアップロード $ rsync -auvz --dry-run ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/ // リモート -> ローカルにダウンロード $ rsync -auvz --dry-run [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/ ``` ``--dry-run``オプションで、転送内容を事前に確認できます。 ディレクトリを同期したり、`--delete`オプションしたりする場合に、事前確認することで失敗を減らせます。 ## 完全に同期したい(``--delete``) ```console // ローカル -> リモートにアップロード $ rsync -auvz --delete ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/ // リモート -> ローカルにダウンロード $ rsync -auvz --delete [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/ ``` 通常の差分同期(`--update`)では、 手元のコンテンツを削除して再び同期しても、 サーバー側にデータが残ったままになります。 `--delete`オプションで、ファイル削除の情報も含めて完全同期できます。 デフォルトだと、データは転送前に削除(``--delete-before``)されます。 他にも転送中に削除(``--delete-during``)、転送後に削除(``--delete-after``)のオプションがあります。 ## 指定したい/除外したい(`--include-from` / `--exclude-from`) ```console // コンテンツを指定して同期 $ rsync -auvz --include-from=include.txt [ユーザー名@]ホスト名:ディレクトリ名/ ディレクトリ名/ // コンテンツを除外して同期 $ rsync -auvz --exclude-from=exclude.txt ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/ ``` `--include-from`でホワイトリスト形式、 `--exclude-from`でブラックリスト形式、 で同期するコンテンツを制御できます。 - `include.txt`の例 ```txt dir1 dir2 ``` - `exclude.txt`の例 ```txt .git/ .gitignore .env .DS_Store ``` ```console // 除外ファイルをひとつずつ指定 $ rsync -auvz --exclude=".DS_Store" --exclude=".env" ディレクトリ名/ [ユーザー名@]ホスト名:ディレクトリ名/ ``` `--include`や`--exclude`でファイル名を直接指定できます。 ファイルが少ない場合はよいかもしれませんが、 最初からファイル形式を使うことをオススメします。 ## 実行パスしたい(``--rsync-path``) ```console $ rsync -auvz --rsync-path="リモートサーバーのパス" ホスト名:ディレクトリ名 ローカルのディレクトリ名 $ rsync -auvz --rsync-path="~/.local/bin/rsync" ホスト名:ディレクトリ名 ローカルのディレクトリ名 ``` ``--rsync-path``で実行パスを指定できます。 システム全体で`rsyncd`デーモンが起動していないリモートサーバーには`rsync`コマンドが入っていません。 そのような場合に、ユーザーが個人でビルド&インストールした`rsync`を利用できます。