【问题标题】:Linux - copying only new files from one server to anotherLinux - 仅将新文件从一台服务器复制到另一台服务器
【发布时间】:2016-02-26 22:33:00
【问题描述】:

我有一台服务器,文件通过 FTP 传输到某个位置。自传输开始(2015 年 1 月)以来,所有文件都在那里。 我想创建一个新服务器并从第一台服务器的位置传输文件。 基本上,我需要一个 cron 作业来运行 scp 并仅传输自上次运行以来的新文件。

使用 ssh 的服务器之间的连接正常,我可以在服务器之间传输文件而不受限制。 如何在 Ubuntu 中实现这一点?

与另一个问题的可能重复不成立,因为在我的目标服务器上,我将只有一个文件,我应该保留上次 cron 运行的日期,并且将从第一台服务器复制的文件将被解析并后删除。

rsync 只会确保所有文件都存在于两个服务器中,对吗?

【问题讨论】:

  • 使用rsync
  • @fedorqui:添加了为什么我不需要同步服务器的补充说明。谢谢!
  • 好的! Reopened the post
  • rsync -azHvu --remove-source-files source destination 就足够了。 -u 只会复制目标中较新或不存在的文件。 --remove-source-files 将删除已从源同步的文件。
  • @alvits:我需要使用从源复制的文件然后删除。理想情况下,目标文件夹将为空,或者只有 php 脚本尚未处理的文件。

标签: linux ubuntu cron scp


【解决方案1】:

我设法使用以下方法在远程计算机上设置 cron 作业:

我首先创建了一个时间戳文件,它将在 cron 作业运行时保留最后一个时间戳:

touch timestamp

然后我用 ssh 和 scp 命令复制所有文件:

ssh username@remote find <files_path> -type f -newer timestamp | xargs -i scp -i username@remote:'{}' <local_path>

然后我用新的修改时间触摸时间戳文件:

touch -m timestamp

此脚本的唯一问题是,如果在 ssh 运行期间将文件复制到远程主机,然后第二次接触时间戳,则此文件在以后的运行中将被忽略。

后期编辑: 为了确保时间戳文件和实际运行之间没有因为 ssh 命令持续时间的差距,脚本被更改为:

touch timestamp_new
ssh username@remote find <files_path> -type f -newer timestamp | xargs -i scp -i username@remote:'{}' <local_path>
rm -rf timestamp
mv timestamp_new timestamp

【讨论】:

  • 我有一个建议。使用最后一个文件的时间戳作为参考创建时间戳怎么样?假设最后一个文件的时间戳是下午 1:00,那么时间戳将是下午 1 点,即使您的 cron 花了超过 10 分钟来复制所有文件并且最终在下午 1:00 之后添加了更多文件。试试touch -r **lastfile as reference**
  • @alvits:谢谢!这就是我所做的,我正要发布它,但方式略有不同。在 ssh 之前,我创建了一个新文件 touch timestamp_new。在 ssh 结束时,我删除了 timstamp 并将 timestamp_new 的时间更改为时间戳。
  • 使用最新的文件作为参考会更准确,不是吗?在您的方法中,如果时间戳文件早于复制的最新文件,您可能会复制已复制的文件。
猜你喜欢
  • 2021-06-22
  • 2014-05-17
  • 1970-01-01
  • 2020-06-18
  • 2018-07-08
  • 2011-02-05
  • 2011-02-06
  • 2018-08-16
  • 1970-01-01
相关资源
最近更新 更多