按创建时间在服务器之间复制文件

按创建时间在服务器之间复制文件

我对 Bash 脚本的了解非常薄弱,所以我在这里寻求帮助。根据性能,使用下面描述的规范,从一台 LINUX 服务器查找文件并将其复制到另一台 LINUX 服务器的最有效的 Bash 脚本是什么。

我需要一个 Bash 脚本来查找仅限新在 0 到 10 分钟前,在服务器 A 中名为“Z”的目录中创建的文件。然后将它们传输到服务器 B。我认为可以通过格式化查询并为每个新创建的文件执行该查询来完成“scp /X/Y.../Z/file root@hostname:/X/Y.../Z/”如果脚本在服务器 B 上找不到这样的远程路径,它将继续复制目录存在的第二个文件。复制文件时应包含权限、组、所有者和创建时间。

X/Y... 是各种目录路径。我想设置一个 cron 作业,每 10 分钟执行一次此脚本。因此,在这种情况下,性能非常重要。

谢谢。

答案1

rsync 可能适合您的需求。在编写糟糕的 rsync 复制脚本之前,请先检查 rsync。否则,可以使用 find 命令根据名称和年龄查找文件,然后对找到的文件运行 scp 命令。

答案2

for d in $(find . -type d -name Z); do find $d -maxdepth 1 -type f -amin -10 -print0 | rsync -av --files-from=- --from0 ./ root@hostname:; done

答案3

rsync是您的最佳选择,并且将是最优化的。具体来说,您想确保通过使用选项来保留时间-t,但-a选项(存档,包括-t)通常是最好的起点。(如果您使用的是 Mac OS X,最好还包括-E保留扩展属性和资源分支的选项。)阅读手册页,使用-n/--dry-run选项执行所有测试,以便您实际上不会将任何更改提交到磁盘,并注意如何使用或省略目录名称上的尾部斜杠,因为它们会改变rsync的行为。

不幸的是,find这将不起作用,因为大多数平台上的实现只能比较以“天”为粒度的时间(不幸的是,四舍五入),所以您将无法找到过去 10 分钟内创建的文件。

因此,最好使用多个rsynccron 作业或脚本来执行所有必要的操作。如果你有rsync对于要同步的小文件,10 分钟可能太短了,但这一切都取决于您的特定数据集,因此请进行一些测试。当然,初始同步将花费更长时间,因此请在安排 cron 作业之前手动执行它。

相关内容