/home/hoge/以下を/home/fugaにバックアップする場合、以下のようにかける。
$ rsync -avv --checksum --backup --backup-dir=/home/fuga_bkup /home/hoge/ /home/fuga
これを並列に行う。ざっくりと言って、/home/hoge/以下のディレクトリがほとんど同じサイズだとすれば、以下のようにかける。ほとんど書き捨て。
$ cat rsync.sh
#!/bin/sh -x
DEBUG=1
SRC=/home/hoge/
DST=/home/fuga/
BKUP=/home/fuga_bkup
RSYNC="rsync -avv --checksum --backup"
mkdir -p "${DST}"
for i in `find "${SRC}" -depth -maxdepth 1 ! -regex "${SRC}"`
do
if [ "${DEBUG}" = "1" ];
then
echo ${RSYNC} --backup-dir="${BKUP}" "${i}" "${DST}" &
else
${RSYNC} --backup-dir="${BKUP}" "${i}" "${DST}" &
fi
done
wait
ls -R "${BKUP}"
上のスクリプトだと、ディレクトリに空白文字が含まれる場合に失敗する。そこで以下。ざっくりとこれでおk。10Mbpsの帯域を5.8Mbps程度使うようになった。
$ eval `find /home/hoge/ -depth -maxdepth 1 ! -regex /home/hoge/ -exec echo rsync -avv --checksum --backup --backup-dir=/home/fuga_bkup \"{}\" /home/fuga/ \& \;`
$ eval `find /home/hoge/ -depth -maxdepth 1 ! -regex /home/hoge/ -exec echo rsync -avv --checksum --backup --backup-dir=/home/fuga_bkup/ \"{}\" /home/fuga/ 2\>\&1 \& \;`
各ディレクトリ内に含まれるファイルだけの同期をとることで、高速化を狙う。
$ find \
/path/to/src/ \
-depth \
-type d \
-printf '/path/to/src/./%P\0' \
| xargs \
-0 \
-r \
-n 1 \
-P 16 \
-I{} \
rsync \
--archive \
--no-recursive \
--relative \
{} \
/path/to/dst/ \
;