这个问题本质上是因为我使用经验不足rsync
,如果重复我会立即删除它。
我有一个/dir-scr
本地文件夹,不断地输入来自传感器读数的生产数据。大约每 10 分钟一班yyyymmddhhmmss.dat
正在创建一个带有时间戳文件名的文件,大约填充 0 到 40MB。并关闭。大约 10 分钟后,将创建另一个文件。
我已经执行了几次更新的批量执行:
$ rsync -azvP /dir-src/* host-dst:dir-src/
它成功复制并替换部分填充的文件,即复制 40MB 的完整文件和 25MB 的当前文件,并在下次更新时,用 40MB 的完整版本替换 25MB 文件。
目前,我进行了手动移动操作,以免错误地删除任何尚未复制的文件。
现在我想使用其中一个rsync
标志,例如:
--exclude
--delete-excluded
--delete-after
--remove-source-files
但我不确定他们的操作。
问题是,如何用于rsync
移动文件,比如说,超过 10 分钟的文件,以及/dir-src
当且仅当它们已经存在时删除host-dst:dir-dst/
。
答案1
我相信使用 rsyncs 内置删除选项是不是正确的方法来解决这个问题。如果您执行类似以下操作:
$ rsync -azvP --remove-source-files /dir-src/* host-dst:dir-src/
您可能会遇到 rsync 传输部分填充的文件然后将其删除的情况。如果使用相同名称重新创建文件,则 rsync 将覆盖目标计算机上的副本。因此,您将丢失文件的前半部分。
也许你想考虑一下这个。让rsync正常进行传输,然后你可以设置一个定时任务每十分钟运行一次并执行类似的操作。
$ find /dir-src -type f -mmin +15 -exec rm -f {} +
这将找到该dir-src
目录下所有超过 15 分钟的文件并将其删除。我们在此假设填充文件所需的最长时间为 15 分钟。您可能需要调整该值以满足您的需求。另外,在测试时请替换-exec rm -f {} +
为-print
,这将确保 find 在执行任何破坏性操作之前仅拾取您实际要删除的文件。
在您的评论中,您说您的网络连接不可靠,并且担心 rsync 可能无法成功完成。创建辅助目录后,解决此问题的一种方法可能如下:
- 每 15 分钟,将所有超过 15 分钟的文件从 移动
dir-src
到dir-aux
。 - 每 10 分钟,rsync 文件从
dir-aux
到host-dst:dir-src
。 - 每 60 分钟删除
dir-aux
.
这将确保 rsync 在文件被删除之前有机会运行 5-6 次。根据您的连接情况,这可能就足够了。然后,您可以根据测试结果延长或缩短 60 分钟。