最新の N GB のファイルのみを rsync する

最新の N GB のファイルのみを rsync する

ディレクトリが 2 つあります。N GB のデータを含む dirA と、dirA の最新の M GB のデータのみを含むはずの dirB です。ファイルが dirA に追加されると、それらは dirB にも追加され、dirB の最も古いファイルは削除される必要があります。

それは rsync で可能ですか? または他のソフトウェアでも可能ですか?

答え1

ここに試みがあります。注意: 次のコードは十分にテストしていません。

dirA=/path/to/dirA
dirB=/other/path/to/dirB

tmpdir=/path/to/tmpdir

cd "$dirA"
find . -type f -printf '%T@ %s %p\0' | sort -nr -z \
awk 'BEGIN {RS="\000"; ORS="\000"; maxsize=2147483648} 
{size += $2; if (size > maxsize) exit; print $3}' | \
rsync -Rpt --link-dest="$PWD" --files-from=- -0 . "$tmpdir" && \
rsync -rpt --delete "$tmpdir" "$dirB"

いくつかの説明:

  • find、、およびsortの各部分の目的awkは、最新のファイルの機械解析可能な(つまり、ヌルで区切られた)リストを取得し、新しい順に並べ、累積サイズが 2 GiB に達したときにそのリストを切り捨てることです(2147483648 は単純に 2*2^30 バイト、つまり 2 GiB です。この数値は好みに応じて調整してください)。
    注記:未満部分の比較awkは、サイズがハード上限(「せいぜい" 条件) であるため、次のような状況が発生する可能性があります。最新のファイルが 4 GiB の場合、同期には何も含まれません。をprint $3の先頭に移動する{ }と、逆の動作になります ("少なくとも") の場合、4 GiB のファイルが生成され、意図した量の 2 倍の量が同期されることになります。最初の方法の方が望ましいと思いました。
  • 最初のステップではrsync、それらのファイルを一時的な場所 ( "$tmpdir") に抽出しますが、パス (-R別名--relative) は保持します。完全なコピーではなくハード リンク ( を使用--link-dest) を使用するため、このステップで使用するスペースはごくわずかですが、$tmpdirと同じファイル システムに存在する必要があります$dirA
  • 2 回目のrsync呼び出しでは、$dirBと実際に同期し、で見つからない--delete古いファイルをで削除します。一時ディレクトリを使用してこれを 2 つの手順で実行する理由は、削除部分を 1 つの手順で実行する方法を見つけていないためです。$dirB$tmpdir

関連情報