我有兩個目錄,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"
一些解釋:
find
、sort
和部分的目的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