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

相关内容