rsync 僅最新的 N GB 文件

rsync 僅最新的 N GB 文件

我有兩個目錄,dirA 包含 N GB 數據,dirB 應該只包含 dirA 中最新的 M GB 數據。當檔案被加入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"

一些解釋:

  • findsort和部分的目的awk是獲取最新文件的機器可解析(即空分隔)列表,按最新的優先排序,然後在累積大小達到 2 GiB 時截斷該列表(2147483648 只是 2* 2^30 字節,或2 GiB;根據需要調整此數字)。
    筆記:少於零件中的比較awk意味著尺寸是硬上限(“最多“條件),因此可能會導致以下情況:如果最新文件為 4 GiB,則同步中不會包含任何內容。將 移至print $3開頭以{ }獲得相反的行為(”至少"),在這種情況下,您將獲得 4 GiB 文件,最終同步量是您預期的兩倍。我認為第一個更理想。
  • 第一個rsync將這些檔案提取到臨時位置 ( "$tmpdir") 但保留路徑 (-R又稱--relative)。由於它使用硬連結(使用--link-dest)而不是完整副本,因此此步驟使用的空間可以忽略不計,但$tmpdir必須駐留在與 相同的檔案系統中$dirA
  • 第二次rsync呼叫實際同步$dirB並刪除在 中找不到的--delete舊檔案。使用臨時目錄並分兩步執行此操作的原因是我還沒有找到一種方法讓刪除部分只需一步即可完成。$dirB$tmpdir

相關內容