rsync を使用して、複数のディレクトリを同じ場所にコピーします。

rsync を使用して、複数のディレクトリを同じ場所にコピーします。

私は、ハードリンクを使用して外部ドライブに部分バックアップを作成するTime Machineなどのバックアップスクリプトを使用しています。

#!/bin/bash

date=`date "+%Y-%m-%dT%H-%M-%S"`
backup=/mnt/backup
targets="/ /data/seafile /boot /boot/efi"

mkdir -p $backup/logs 

rsync -a \
    --stats \
    --partial \
    -h \
    -H \
    -A \
    -X \
    -x \
    --log-file=$backup/logs/$date.log \
    --exclude='/media/**' --exclude='/mnt/**' --exclude='/proc/**' --exclude='/sys/**' --exclude='/tmp/**' --exclude='/run/**' --exclude='/dev/**' \
    $targets \
    --link-dest=$backup/latest \
    $backup/incomplete_$date \
    && mv $backup/incomplete_$date $backup/$date \
    && rm -f $backup/latest \
    && ln -s $backup/$date $backup/latest

結果:

/mnt/backup/
├── 2016-05-24T16-33-08
...
├── 2016-12-01T22-04-25
├── 2016-12-05T20-29-52
├── latest -> /mnt/backup/2016-12-05T20-29-52
├── logs
└── lost+found

LVMを使用してデータを別のマウントポイントに分割するまで、これまではうまくいきました。今、これらのバックアップの内容は次のとおりです。

/mnt/backup/latest
├── bin
├── boot
├── data
...
├── efi
...
├── seafile
...

私が実際に意図したのは、rsyncがリスト内の各項目を/ /data/seafile /boot /boot/efi階層の正しい場所にコピーすることです。たとえば、フォルダは次のように終了する必要があります。

/mnt/backup/latest
├── boot
│   ├── efi
...
├── data
│   └── seafile

各ターゲットを指定する理由は-xオプションのためです。これにより、再帰中にrsyncがファイルシステムの境界を超えないようにすることができます。 「簡単な」解決策は次のとおりです。

  • -xフラグの削除
  • /対象のみ

しかし、これは私にいくつかの追加の欠点をもたらします。たとえば、不要なマウントポイントを除外するには、追加のタグを使用する必要がありました--exclude='/.../**'。現時点ではそれほど多くはありませんが、オプトアウトソリューションではなくオプトインソリューションを持ちたいです。

答え1

希望の効果を得るには-R(または)フラグを使用できる必要があります。--relativeターゲットからソースへのフルパスを再現します。たとえば、rsync -aR /a/b/c /destディレクトリが作成されます/dest/a/b/c

作業を続ける--link-destことはできますが、最初の新しいコピーを作成した後にのみ、最後のバックアップのディレクトリを新しい階層と一致するように移動することをお勧めします。それ以外の場合、すべてのハードリンクは生成されません。

関連情報