ディレクトリをコピーするときの挙動
source の後ろにスラッシュを付けるかどうかで挙動が変わる。
すなわち rsync -a source dest と rsync -a source/ dest は違う。
- 前者だと source を dest にコピーしてくるという意味になるので
dest/sourceディレクトリができる - 後者だと source の中身を dest にコピーしてくるという意味になるので
destディレクトリの中身とsourceディレクトリの中身を一致させるように上書きする
特定のファイルタイプだけ処理したいとき
例えば jpeg だけ処理したいなら --include='*/' --include='*.jpg' --exclude='*' のようにする。
cf. rsync の複雑怪奇な exclude と include の適用手順を理解しよう - てっく煮ブログ
なぜ?
rsync は処理するかの判定をディレクトリ構造を下りながら逐一行い、ディレクトリが exclude された時点でそのディレクトリ内のファイルはすべて保存しない。
なので上のように書くことで
- あらゆるディレクトリは必ず include する
- このフィルタを付けて初めて全ファイルが検索対象になる
*.jpgは必ず include する- それ以外のファイルは exclude する
となり、所望の動作が達成できる。なお、jpeg ファイルがないディレクトリについても、空のディレクトリがコピーされてしまうがご愛敬
応用
シェルのブレース展開機能を使うと、--exclude={'*.jpg','*.png'} のようにすることで複数のファイルタイプを一括で排除できる
バックアップをとるとき
オプションとして -ahH --info=progress2 としておけばよい
-a:-rlptgoDに等しい- recursive
- copy symlinks as symlinks
- preserve permissions
- preserve modification times
- preserve group
- preserve owner
- preserve device and special files
-h: numbers in human-readable format-H: ハードリンクを保持
進行度を正確に把握したいとき
--no-inc-recursive とすると、転送前にすべてのファイルのスキャンを行い、総転送量を把握したうえで全体の進捗を正確に表示する
通信・ファイルアクセスが遅いとき
-z: ファイルデータを圧縮-W: 増分アルゴリズムなしで全体をコピーする。ネット接続よりディスクアクセスが遅いときに有効