ディレクトリが 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