0

我有一个包含数万个文件和 520 GB 数据的文件夹,我每晚通过 rsync 同步到远程主机。这个过程通常需要大约 5 个小时。我还想在白天将那些新的和更改的文件复制到远程位置而不比较两棵树,这就是 rsync 所做的,因为有时目标上的人需要访问新文件,所以我开始玩弄scp 但我不确定如何解决我迄今为止遇到的两个问题。是的,我是 bash 的新手。:)

这是我想每小时运行的命令: find Folder/ -type f -mmin -60 -print0 -exec scp "/rootfolder1/subfolder1/{}" "user@host:/rootfolder2/subfolder2/{}" \;

我遇到的问题是:当传递给 scp 的字符串有空格时,它不起作用并触发错误“scp ambiguous target”。显然 scp 需要用反冲转义的空格,但我不知道如何指示 FIND 以这种方式打印路径,也不知道如何在其中插入 SED 命令来执行以下操作: sed 's/ //g' .

另一件事是,当要复制的文件位于目标 scp 中不存在的文件夹中时,也会产生错误。所以我不知道在尝试复制每个文件之前是否应该尝试使用“mkdir -p”(假设 mkdir -p 在远程主机上工作)或者是否有任何方法可以强制 scp 创建丢失的文件夹。

当然,如果您可以提出更好的解决方案,请务必!谢谢你。

4

2 回答 2

0

您可以尝试将所有这些包装在一个 for 循环中:

for i in `find /FOLDER -type f -mmin -60`; 做 scp "$i" user@host:"$i"; 完毕

我在这里的示例会将您查找的文件复制到另一台服务器上的同名文件夹中。变量 ($i) 周围的双引号应该有助于空格。

将其作为 cronjob 运行,您可能会得到您想要的结果。但是,我会谨慎这样做,您可能会遇到竞争条件,您将在第一个复制过程完成之前运行第二个复制过程。

如果您在第一次运行之前运行“时间”命令,您可以了解如何创建一个 cronjob 窗口。希望这可以帮助。

于 2015-01-13T17:03:08.763 回答
0

这可能有点矫枉过正,但如果您想在创建或更改文件后尽快复制文件,请查看 inotify。

inotify 可以监视目录并在发生更改时通知您。

见: http: //linux.die.net/man/7/inotify

如果你适合 C,我为你上传了一个小例子:

http://pastebin.com/1AUW7fs3

或者,如果您想坚持使用 bash,请查看:

inotify 和 bash

于 2013-10-31T18:38:00.643 回答