![无需 rsync 同步两个目录](https://linux22.com/image/93554/%E6%97%A0%E9%9C%80%20rsync%20%E5%90%8C%E6%AD%A5%E4%B8%A4%E4%B8%AA%E7%9B%AE%E5%BD%95.png)
我知道你现在在想什么”只需使用rsync” 但不幸的是这个系统没有 rsync,我想提出另一个解决方案。
设置:
- 源服务器有一个包含 140 000 多个文件的上传文件夹(无子目录)
- 目标服务器需要包含 140 000+ 文件的上传文件夹
让我们称之为仅用便利贴进行迁移...现在让事情变得复杂的是,由于生成了新的上传或缩略图,服务器 1 每天都会不断获取新文件,因此您现在脑海中浮现出这个想法“只需将文件从 1 复制到 2“将不起作用,因为一旦我完成了大约 20+GB 的副本,我就可以重新开始,因为源服务器上已经有新文件......
我的解决方案想法
- 将完整文件夹从源复制到目标
- 在目标服务器中查找最新的创建日期并用作源服务器上的起点
- 将自上次创建日期以来的所有文件从源复制到目标(增量)
- 设置一个 cron 来尽可能频繁地执行此操作。
我的问题
find /uploads/* -mtime -1 bash: /bin/find: Argument list too long
现在,在我开始编写 bash 脚本循环之前,我想知道是否有人可以建议另一种无需 bash 脚本即可完成此操作的方法...良好的旧低级 CLI。
答案1
我已经设法找到解决方案,但还没有找到解决方案。我仍在努力。
假设您可以信任文件系统创建/修改日期,则可以使用 find 生成文件列表,将其输出到文本文件中,然后使用循环对目标服务器执行 scp。我似乎无法将查找结果直接正确地发送到 scp 。
我使用了一个辅助程序sshpass,但我知道最好使用密钥文件
从目标服务器查找源服务器中的文件并保存结果,将结果限制为仅一个目录和文件。
sshpass -p 'MyPassword' ssh [user@server] "find [path/to/look/in] -maxdepth 1 -mtime -1 -type f" > /tmp/last-24-hours-file-list.txt
循环输出文件并调用每个文件的 scp
while read filename; do sshpass -p 'MyPassword' scp -Crpv [user@server]:$filename [path/to/save/to]; done < /tmp/last-24-hours-file-list.txt