名前が変更されるディレクトリのコピーを維持するためにrsyncを使用する

名前が変更されるディレクトリのコピーを維持するためにrsyncを使用する

Linux システムで rsync を使用して、ローカル ディスクと接続された USB ドライブ間でディレクトリを同期しています。私が経験している問題は、サーバー上で毎日バックアップを作成するサード パーティ システムが、バックアップの奥深くにネストされたディレクトリの名前を実際に変更することです。このディレクトリには、バックアップに必要なデータの大部分が含まれています。rsync がディレクトリを確認すると、名前が変更されたことがわかり、完全に新しいディレクトリであるとみなします。そのため、USB ドライブ上の rsync コピーには、実行される日ごとに新しいディレクトリがあります。

実際にディレクトリ名を元に戻すスクリプトを作成しましたが、これは面倒な方法です。

私は、この問題に対処する「エレガントな」方法を探しています。ディレクトリへのリンクを一定のままにすることは可能ですか? ディレクトリ名が変更されてもディレクトリが同じであることを検出するように rsync を設定できますか? これまでにもこの問題に対処したことがある人がいるはずです。

答え1

1 つの方法は、2 つの手順で実行することです。1 つ目は、無視パターンを使用して、問題のディレクトリ以外のすべてを rsync します。2 つ目は、次のように、bash で glob を使用してディレクトリのみを rsync し、ディレクトリにアクセスします。

rsync -av /usr/lib/mydata/bigdatadir*/ /mnt/usbvolume/bigdatadir/

ソースディレクトリの末尾にスラッシュを使用すると、rsyncはディレクトリ名を無視するようになります。コンテンツディレクトリ自体ではなく、ディレクトリの全体を参照します。もちろん、このグロブは、上記の例のようにディレクトリ名に一定のプレフィックスまたはサフィックスが付けられている場合に最も簡単です。そうでない場合は、ディレクトリの実際の名前を調べるスクリプトを作成し、次のようにより直接的に行うことができます。

rsync -av /usr/lib/mydata/$BIGDATADIRNAME/ /mnt/usbvolume/bigdatadir/

最終的に、疑似コードは次のようになります。

  1. $BIGDATADIRNAMEを見つける
  2. 以前と同じようにすべてをrsyncしますが、$BIGDATADIRNAMEは無視します。
  3. Rsyncをコンテンツ$BIGDATADIRNAMEの

答え2

rsyncオプションを使用できる場合があります--比較先=DIR--copy-dest=DIR、 または--link-dest=DIR受信側で不足しているファイルを探すための追加ディレクトリを指定できます。

たとえば、--link-dest を使用すると、rsync は変更されたファイルの新しいコピー、または変更されていないファイルのハードリンクされたコピーを含むディレクトリの新しいバージョンを作成します。

これらのオプションのいずれかを使用するには、前回の rsync 実行から USB ドライブ上のディレクトリ名を知っている必要があるため、最初に正しいディレクトリ名を判断するスクリプトで rsync をラップする必要があります。

新しいバージョンを作成した後、ディレクトリの古いバージョンを削除するには、--delete-after を使用することもできます。

答え3

rsync だけでは必要な操作を実行できません。rsync が利用できるメタデータはディレクトリ名と MACtimes だけだからです。

これを rsync 内で自動的に処理する唯一の方法は、rsync に何らかの方法でメタデータを追加することです。たとえば、Windows 上の Microsoft の DFS レプリケーションでは、NTFS ボリューム内のファイルに割り当てられた一意の ID を使用して、ファイル名 (またはディレクトリ名) が変更されたときにそれをキャッチすることでこれを処理します。

あなたの洗練されていないスクリプトは、おそらく rsync をダンプして別のツールを探すことなく、必要なことを実行する最も簡単な方法です。

シンボリック リンクを使用すると、ジャンクション ポイントが宛先ディレクトリの名前に関連付けられているため (この場合、宛先ディレクトリの名前は変更されます)、機能しません。ハードリンク (inode に関連付けられている) を使用することもできますが、ディレクトリ名が単に削除されて再作成されるのではなく (別の inode が割り当てられる)、ディレクトリ名が変更されていることを確認する必要があります。

関連情報