【发布时间】:2021-09-09 15:41:06
【问题描述】:
我想在 Linux 中的两个目录之间进行单向同步。一个包含文件,另一个包含 已处理 个文件,但具有相同的目录结构和相同的文件名,但可能缺少某些文件。
现在我在做:
cd $SOURCE
find * -type f | while read fname; do
if [ ! -e "$TARGET$fname" ]
then
# process the file and copy it to the target. Create directories if needed.
fi
done
这可行,但速度非常慢。 有更好的方法吗?
大约有 50.000.000 个文件,分布在目录和子目录中。每个目录包含的文件/子目录不超过 255 个。
我看过
-
rsync: 似乎它总是进行大小或时间戳比较。这将导致每个文件都被标记为不同,因为处理需要一些时间并更改文件内容。 -
diff -qr: 无法弄清楚如何让它忽略文件大小和内容
编辑
有效假设:
- 仅根据目录/文件名进行比较
- 我们不关心文件元数据和/或属性(例如,大小、所有者、权限、上次修改的日期/时间等)
- 我们不关心可能驻留在目标目录中但在源目录中没有匹配文件的文件。这只是部分正确,但从源中删除的情况很少见,而且是批量发生的,所以我会为此做一个特殊情况。
【问题讨论】:
-
fwiw,您可以使用
comm -13 "${srcfiles}" "${tgtfiles}"获取${TARGET}-only 文件的列表,用于批量删除过程;或者,将comm调用替换为单个diff,并使用条件来确定结果是${SOURCE}-only 还是${TARGET}-only;就个人而言,我发现comm输出更容易使用,ymmv ...
标签: linux bash synchronization rsync