rsync 3.2.0の新機能を少し試す

ファイル同期にとても便利なrsyncの3.2.0がリリースされました.

バグフィクスや,いくつかの新機能が入ったようなので少し試してみました.

※1. この記事投稿時には 3.2.2 が出ています.
※2. 鹿児島Linux勉強会 2020.06で発表したものと同じ内容です.

導入例

Debian sid amd64 & Ubuntu 20.04 LTS amd64

$ sudo apt build-dep rsync
$ sudo apt install libxxhash-dev libzstd-dev liblz4-dev
$ wget -c \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz \
https://download.samba.org/pub/rsync/rsync-3.2.0.tar.gz.asc \
https://opencoder.net/WayneDavison.key
$ gpg2 --import ./WayneDavison.key
$ gpg2 --verify ./rsync-3.2.0.tar.gz.asc
$ tar tvzf ./rsync-3.2.0.tar.gz
$ tar xzf ./rsync-3.2.0.tar.gz
$ cd rsync-3.2.0
$ ./configure --help
$ ./configure
$ make
$ ./rsync --version
rsync  version 3.2.0  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
    ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
    xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
Note
gpg鍵は次から入手できます.rsync download

Raspberri Pi OS amd64

Raspberry Pi OS arm64の場合 libzstd-dev のバージョンが 1.3.8+dfsg-3 と少し古くbuildに失敗します. ./configure --disable-zstd としてzstdを無効にするか,sourceから zstd 1.4.5 を導入することでbuild出来ました.

$ make
  :
token.c: In function ‘init_compression_level’:
token.c:73:40: warning: implicit declaration of function ‘ZSTD_minCLevel’; did you mean ‘ZSTD_maxCLevel’? [-Wimplicit-function-declaration]
   min_level = skip_compression_level = ZSTD_minCLevel();
                                        ^~~~~~~~~~~~~~
                                        ZSTD_maxCLevel
token.c: In function ‘send_zstd_token’:
token.c:685:2: error: unknown type name ‘ZSTD_EndDirective’; did you mean ‘ZSTD_DDict’?
  ZSTD_EndDirective flush = ZSTD_e_continue;
  ^~~~~~~~~~~~~~~~~
  ZSTD_DDict
token.c:685:28: error: ‘ZSTD_e_continue’ undeclared (first use in this function)
  ZSTD_EndDirective flush = ZSTD_e_continue;
                            ^~~~~~~~~~~~~~~
token.c:685:28: note: each undeclared identifier is reported only once for each function it appears in
token.c:701:3: warning: implicit declaration of function ‘ZSTD_CCtx_setParameter’ [-Wimplicit-function-declaration]
   ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
   ^~~~~~~~~~~~~~~~~~~~~~
token.c:701:37: error: ‘ZSTD_c_compressionLevel’ undeclared (first use in this function); did you mean ‘skip_compression_level’?
   ZSTD_CCtx_setParameter(zstd_cctx, ZSTD_c_compressionLevel, do_compression_level);
                                     ^~~~~~~~~~~~~~~~~~~~~~~
                                     skip_compression_level
token.c:751:13: error: ‘ZSTD_e_flush’ undeclared (first use in this function); did you mean ‘ZSTD_DCtx_s’?
     flush = ZSTD_e_flush;
             ^~~~~~~~~~~~
             ZSTD_DCtx_s
token.c:753:8: warning: implicit declaration of function ‘ZSTD_compressStream2’; did you mean ‘ZSTD_compressStream’? [-Wimplicit-function-declaration]
    r = ZSTD_compressStream2(zstd_cctx, &zstd_out_buff, &zstd_in_buff, flush);
        ^~~~~~~~~~~~~~~~~~~~
        ZSTD_compressStream
$ cd ..
$ sudo apt remove libzstd-dev
$ wget https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz \
https://github.com/facebook/zstd/releases/download/v1.4.5/zstd-1.4.5.tar.gz.sha256
$ sha256sum -c ./zstd-1.4.5.tar.gz.sha256
$ tar tvf ./zstd-1.4.5.tar.gz | lv
$ tar xf ./zstd-1.4.5.tar.gz
$ cd zstd-1.4.5
$ make
$ sudo make install
$ cd ../rsync-3.2.0
$ ./configure && make

Debian sid amd64

Debian sid amd64 環境にはすでに降ってきているのでパッケージから導入するだけでOKです.

$ sudo apt install rsync
$ rsync --version
rsync  version 3.2.0  protocol version 31
Copyright (C) 1996-2020 by Andrew Tridgell, Wayne Davison, and others.
Web site: http://rsync.samba.org/
Capabilities:
    64-bit files, 64-bit inums, 64-bit timestamps, 64-bit long ints,
    socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, append,
    ACLs, xattrs, iconv, symtimes, prealloc, SIMD
Checksum list:
    xxh64 (xxhash) md5 md4 none
Compress list:
    zstd lz4 zlibx zlib none

rsync comes with ABSOLUTELY NO WARRANTY.  This is free software, and you
are welcome to redistribute it under certain conditions.  See the GNU
General Public Licence for details.
$ dpkg-query -W rsync
rsync   3.2.0-1

ってことで試せるようになりました.NEWSを見てみます.

BUG FIX

Avoid a hang when an overabundance of messages clogs up all the I/O buffers.

このバグ修正がちょっと気になります.fat32の制限に引っかかったときに帰ってこない問題もこれで解決してるかも?未確認.

ENHANCEMENTS

–checksum-choice=STR, –cc=STR

チェックサム形式を選べるようになったようです.現在選択できるのは xxh64/md5/md4 の3種類 or none or auto(既定値)

man(1)より
              o      auto (the default)
              o      xxh64 (aka xxhash)
              o      md5
              o      md4
              o      none

--version にも出力されます.

$ rsync --version | grep Checksum -A1
Checksum list:
    xxh64 (xxhash) md5 md4 none

configure option に --disable-xxhash がありました.

  --disable-xxhash        disable xxhash checksums

環境変数 RSYNC_CHECKSUM_LIST でも指定できます.オプション --checksum-choice がある場合はオプションのほうが優先なようです.

ちなみに --checksum-choice オプションに対応していない 3.1.3 に対して xxh64 を向けて叩いてみると以下のようなエラーになりました.(md4, md5 はok)

$ rsync --checksum-choice=xxh64 -avc ./* user@remote:/tmp/
unknown checksum name: xxh64
rsync error: requested action not supported (code 4) at checksum.c(73) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]

時間がどのくらい変わるかちょうど転がっていたkernel source(小さいファイルが沢山)で試してみました.はじめ普通に同期した後,キャッシュクリアして md4, md5, xxh64 で試してみました.思ったより差が出ない感じ?

md4
$ find ./linux-5.6 | wc -l
82114
$ du -ms ./linux-5.6
1310    ./linux-5.6
$ rsync --checksum-choice=auto -ac ./linux-5.6 /tmp/
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./linux-5.6 /tmp/
3

real    0m52.393s
user    0m5.051s
sys     0m12.246s
md5
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./linux-5.6 /tmp/
3

real    0m57.716s
user    0m6.976s
sys     0m13.486s
xxh64
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./linux-5.6 /tmp/
3

real    1m5.520s
user    0m2.507s
sys     0m13.625s

大きめのファイルでも試してみました.4GB程のisoファイル1つです.md4, md5 はあまり代わりませんが,xxh64 はかなり高速ですね.

md4
$ ls -s ./Parrot-security-4.9.1_x64.iso*
3909164 ./Parrot-security-4.9.1_x64.iso  3909164 ./Parrot-security-4.9.1_x64.iso2
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md4 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x
64.iso2
3

real    0m23.276s
user    0m10.601s
sys     0m4.387s
md5
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=md5 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3

real    0m28.150s
user    0m16.945s
sys     0m4.399s
xxh64
$ sync ; echo 3 | sudo tee /proc/sys/vm/drop_caches ; time rsync --checksum-choice=xxh64 -ac ./Parrot-security-4.9.1_x64.iso ./Parrot-security-4.9.1_x64.iso2
3

real    0m12.767s
user    0m1.375s
sys     0m4.060s

この辺の速度は環境により大分変わると思うので参考程度に.

–compress-choice=STR, –zc=STR

--compress オプション利用時の圧縮形式を指定できるようです.

圧縮形式はrsync 3.2.0 同士では zlibx 形式が zlib 形式よりも優先されるようです.
選択できるオプションは zstd, lz4, zlibx, zlib, none のようです.

man(1)より
              o      zstd
              o      lz4
              o      zlibx
              o      zlib
              o      none

rsync --version でも確認できます.

$ rsync --version | grep Compress -A1
Compress list:
    zstd lz4 zlibx zlib none

configure oprion に --disable-zstd, --disable-lz4 があります.

  --disable-zstd          disable zstd compression
  --disable-lz4           disable LZ4 compression

環境変数 RSYNC_COMPRESS_LIST でも指定できるようです.

未対応の 3.1.3 に対して指定すると unknown option と言われます.

$ time rsync --compress-choice=zstd --compress -a ./hoge mk@x201i.local:/tmp/
rsync: on remote machine: --compress-choice=zstd: unknown option
rsync error: syntax or usage error (code 1) at main.c(1596) [server=3.1.3]
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(235) [sender=3.2.0]

こちらも簡単にベンチを.でもWi-Fi環境だし参考程度に.

zstd
$ ssh user@remote rm -rf ~/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zstd --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    4m38.921s
user    0m24.463s
sys     0m7.182s
lz4
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=lz4 --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    9m28.829s
user    0m4.878s
sys     0m6.177s
zlibx
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlibx --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    5m21.702s
user    0m46.740s
sys     0m6.541s
zlib
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=zlib --compress -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    5m28.722s
user    0m45.861s
sys     0m6.381s
none
$ ssh user@remote rm -rf ~user/tmp/linux-5.6; echo 3 | sudo tee /proc/sys/vm/drop_caches; time rsync --compress-choice=none -a --rsync-path=~/src/rsync-3.2.0/rsync ~/src/linux-5.6 user@remote:~/tmp/
3

real    22m56.712s
user    0m1.848s
sys     0m7.323s

–debug=NSTR

チェックサムと圧縮の詳細を表示するオプションのようです.どのアルゴリズムを利用しているのかが確認できます.

–debug=NSTR を付けたときのの実行結果例
Client negotiated checksum: xxh64
Client compress: zstd (level 3)

–debug=OPTS, -M—​debug=OPTS

--debug=OPTS を使うとリモートのrsyncにデバッグオプションを送らなくなるようです.これによりクライアント側とサーバ側で異なるデバッグレベルを指定できるようになったそうです.
リモート側にオプションを送る場合には -M—​debug=OPTS

SIGINFO & SIGVTALRM

rsyncプロセスに SIGINFO & SIGVTALRM シグナルを送信することでステータスを表示できるようになったようです.Linuxは SIGINFO に対応していないので, SIGVTALRM を試しました.

rsyncを実行している状態で SIGVTALRM を送信
$ pkill -SIGVTALRM rsync
rsyncがステータスを表示
linux-5.6/arch/sparc/lib/lshrdi3.S
    114,384,392  81%  931.12kB/s    0:01:59 (xfr#21058, ir-chk=1030/23451)

–copy-as=USER[:GROUP]

指定ユーザ/グループ権限でファイルをコピーするようです.

コピー元に3ユーザのファイル
$ ls -Al /tmp/rsync-test/
total 0
-rw-r--r-- 1 matoken  matoken  0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root     root     0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
普通にコピーするとユーザが引き継がれる
$ sudo ./rsync -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken  matoken  0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 root     root     0 Jun 25 18:51 root
-rw-r--r-- 1 www-data www-data 0 Jun 25 18:51 www-data
--copy-as=matoken を指定するとすべてmatokenになる
$ sudo \rm -rf /tmp/rsync-test2
$ sudo ./rsync --copy-as=matoken -a /tmp/rsync-test/ /tmp/rsync-test2
$ ls -lA /tmp/rsync-test2
total 0
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:50 matokenfile
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 root
-rw-r--r-- 1 matoken matoken 0 Jun 25 18:51 www-data

-V

--version の短いオプションとして -V が入りました.

$ ./rsync --help|grep -- -V
--version, -V            print the version + other info and exit
$ ./rsync --help|grep \-V
grep (GNU grep) 3.4
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

–ipv4, -4 / –ipv6, -6

ipv4, ipv6 を指定したいときに rsh='ssh -4' とするより便利な --ipv4, -4, --ipv6, -6 オプションが入りました.

ipv4しかない環境で -6 を指定して失敗する
$ rsync -avc6 ./ user@remote:/tmp/
ssh: Could not resolve hostname remote: Name or service not known
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(235) [sender=3.2.1]

rsyncで同期したファイルの内容が間違っていて困る

最近外のサーバのffmpegで生成したファイルをrsyncコマンドで家にコピーしています.しかし,先日rsyncでコピーが正常終了したファイルなのに再生が出来ないファイルが現れました.
恐らくffmpegの処理が最後まで終わっていない状態でrsyncを開始して,ffmpegの -movflags faststart が最後のあたりでrsyncで転送が終わった領域を書き換えたのではないかと思います.
rsyncはチェックサムを確認していたのでは?と確認するとどうも明示的にチェックサムのオプションを付与しないと簡易的なチェックしかしていないようです.
少し確認してみました.

内容が違うけれどファイルサイズとタイムスタンプの同じファイルを用意する.

$ mkdir from to
$ echo '0123456789' > from/01
$ echo '0123456780' > to/01
$ touch -d0 from/01
$ touch -d0 to/01
$ ls -l from/01 to/01
-rw-r--r-- 1 matoken matoken 11 11月  2 00:00 from/01
-rw-r--r-- 1 matoken matoken 11 11月  2 00:00 to/01

rsync の --archive option でコピーすると同じファイルと認識されて同期されない.内容も異なったまま.

$ rsync -av from/ to/
sending incremental file list

sent 73 bytes  received 12 bytes  170.00 bytes/sec
total size is 11  speedup is 0.13
$ diff from/01 to/01
1c1
< 0123456789
---
> 0123456780

rsync の --checksum optionを付与すると別のファイルと認識されて同期されて内容も同一になる.

$ rsync -av --checksum from/ to/
sending incremental file list
01

sent 147 bytes  received 35 bytes  364.00 bytes/sec
total size is 11  speedup is 0.06
$ diff from/01 to/01

ということでこんな感じに変更した.

$ rsync -avAHXce ssh --partial --append user@server:from/ to/

#実際はよく回線切れるのでwhile loop に入れてある.

EDIT: 転送済み部分のチェックはこれではNGで --append(既存のファイルに追記)を削る必要があった.--append-verify で行けそうな気がしたがこれもNGだった.

環境
$ dpkg-query -W rsync
rsync   3.1.2-2.2
$ lsb_release -d
Description:    Ubuntu 18.10
$ uname -m
x86_64

停電でバックアップが不安なのでlsyncdとNILFS2でバックアップ

先日の台風16号で09/19 23:00頃から09/22 12:45頃まで停電していました……. とりあえずサーバはシャットダウンしてThinkPad X200はバッテリが4本,X220は2本,モバイルバッテリは10000mA x3という感じで停電開始. とりあえず普通に使っていてもX200だけでも3営業日以上は耐えられるはずです.

でも一応NotePCは必須デバイス以外は取り外して輝度を下げてpowertopで省電力モードに.

#powertopについては以下の辺りを参考に.

これで1台ずつ使っていくことに.しかし,不安点がデータのバックアップ. 何時もはワークディレクトリはownCloudで自動バックアップ&デイリーでファイルサーバへのバックアップがされています.しかし停電時はサーバが動いてない&電池の切れたPCから別のPCに作業内容が移行できない.ということでlsyncdを使ってデータをUSBメモリにコピー&ファイルシステムはNILFS2にしてスナップショットも取得できるようにしました.

まずはUSBメモリの用意.普通にNILFS2で作ります.
/dev/sdzのパーティション情報を削除して全領域1パーティションで作成し,NILFS2で初期化して/mntにマウントしてユーザ,グループを自分のものにしています.

$ sudo wipefs -a /dev/sdz
$ sudo fdisk /dev/sdz
Command (m for help): n
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (51-7821311, default 51):
Last sector, +sectors or +size{K,M,G,T,P} (51-7821311, default 7821311):

Created a new partition 1 of type 'Linux' and of size 3.7 GiB.

Command (m for help): w
$ sudo mkfs.nilfs2 /dev/sdz1
$ sudo mount /dev/sdz1 /mnt
$ sudo chown `id -u`.`id -g` /mnt
$ sudo chmod 700 /mnt

続いてlsyncdを実行してデータを同期します.lsyncdはinotifyをトリガーに任意のコマンドを実行したり出来ます.一般的にはrsyncでファイルの同期に使います.今回はアドホックにコマンドとして動かしました.同期元同期先はrsyncと同じ書き方だと思うので前もってrsync -avn from toみたいな感じで動作確認しておくと安心です.

$ lsyncd -log all -nodaemon -rsync /home/mk/ownCloud /mnt/ownCloud

これでlsyncdのターゲット以下のファイル,ディレクトリは自動的にUSBメモリにコピーされ,USBメモリの中では自動的にチェックポイントが作成される状態です. 作業の区切りのタイミングで明示的にスナップショットを取るようにしておくと更に安心です.(チェックポイント,スナップショットには何時でもその状態に巻き戻せる.但しチェックポイントは古いものから順に自動的に削除される.スナップショットは自動削除されない)

マシンを切り替えるときにはlsyncdを止めて念の為rsyncをdry runして同期状況を確認しておいて,新しいマシンでUSBメモリからSSDにrsyncしてlsyncdを動かすという感じでした.

関東在住時の計画停電のときは計画的だし時間もずれないしで案外困りませんでした(仕事は大変だったけど).でも念の為NotePCの大容量バッテリは買い増しして持ち歩いていました.(今回のバッテリの一つもそれ)
↓はその頃の発表スライド

ちなみに停電から14,5時間で携帯基地局のバッテリも尽きたようで完全にオフラインになってしまいました.NILFS2は大抵標準では導入されていないし手元ではGit管理もしているのでNILFS2は使わなくても良かったかなと後で思いました.

復旧時の残容量はNotePC が1.5本/モバイルバッテリが50% x2という感じ未だ行けるなという感じでした.でもネットワークが繋がっていたらもっと利用していたでしょう.

しかしこの辺は雷やら強風やらでよく停電になります.大抵は携帯基地局が落ちるまでには復旧するのですが,台風だと今回のように長い停電に.でも復旧状況を停電情報サイトで確認していると深夜にもステータスが変わっていて24時間体制で復旧してるのかと驚きました.九州電力の関係者のみなんさんありがとうございます_o_
(でも昼頃復旧->本日中->本日未明復旧とステータスがずれ込んでいくとはちょっとつらかったです……)

ついでに今回役にたったものを

  • PETZLのワイヤ式ヘッドライト
    手元のは初代かその次くらいの古いもので暗いけど便利でした.

  • モバイルバッテリー
    Cheerox2に秋葉原で買った謎バッテリーの3本を使っていました.基地局が落ちるまではスマホに給電.基地局が落ちてからはiPad/Kobo/Raspberry Piに給電していました.

  • Raspberry Pi B+ とAdafruit3.5インチ液晶
    USB稼働の液晶モニタもあるのですがバッテリ消費量的にこいつのほうが食わない感じなのでちっこいですがこれで作業したりも.でもNotePCのバッテリが切れなかったのでテスト程度.

    Adafruit PiTFT – 320×240 2.8 TFT+Touchscreen for Raspberry Pi ID: 1601 – $34.95 : Adafruit Industries, Unique & fun DIY electronics and kits

  • エネループ
    自己放電の少ない充電式乾電池です.自己放電が少ないので充電しておいておけば何時でも使えるのが良いです.電気をあまり食わないものはこいつで. ちなみに充電器は単三・単四 ニッケル水素充電池対応 放電機能 USB充電ポート搭載 充電器 (16本用)の通信販売【上海問屋】 | 上海問屋を主に使っています.

  • ユニフレームガスバーナー
    一般的なイワタニとかのタイプのカセットコンロガスが使える(非推奨)なガスバーナーです.山向けのガスやアルコールに比べて大分ランニングコストが安く付きます.低地のみならこれで十分.(手持ちのはゴトクの小さい恐らく古いモデルのものもっと安かったし)

find+rsyncで特定期間のファイルだけ同期する

小ネタですが.
~mk/POD以下から内容更新日時が1440分(1日)以内のファイルを探して同期しています.

cd ~mk/POD ; find . -mmin -1440 -type f -print0 | rsync --delete --progress --files-from=- --from0 ~mk/POD/ /var/www/owncloud/data/matoken/files/podcast/

findコマンドで欲しいファイルを探し,rsyncでその結果を同期しています.
–files-fromに-をつけることでfindで検索したファイルを標準入力から受け取っています.
便利 :)

一応オプションの詳細

  • find
    -mmin -1440 : 内容更新日時が1440分(1日)以内
    -type f : ファイルを検索
    -print0 : 区切り文字をNULLにする

  • rsync
    –delete–delete : 無くなったファイルは削除する
    –progress : プログレスを表示
    –files-from=- : STDINから同期元ファイルリストを読み込む
    –from0 : 区切り文字をNULLとして扱う