我有两个目录,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