我有一个包含数万个文件和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创建丢失的文件夹。
当然,如果你能提出更好的解决方案,那么一定要!! 谢谢。
答案 0 :(得分:0)
这可能有点矫枉过正,但如果您想在创建或更改文件后尽快复制文件,请查看inotify。
inotify可以查看目录,并在发生更改时通知您。
见:http://linux.die.net/man/7/inotify
如果你适合C,我会为你上传一个小例子:
或者如果你想坚持使用bash看看:
答案 1 :(得分:0)
你可以尝试在for循环中包装所有这些:
在我在这里的示例会将您查找的文件复制到另一台服务器上的同名文件夹中。变量($ i)周围的双引号应该有助于空格。
将其作为cronjob运行,您可能会获得所需的结果。我会谨慎地这样做,但是,你可能会遇到竞争条件,你可以在第一个完成之前运行第二个复制程序。
如果在第一次运行之前运行'time'命令,则可以了解cronjob窗口的位置。希望这会有所帮助。