Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在创建文件并删除原始文件时,在远程主机上存储文件的最佳方式是什么?_Bash_Backup_Rsync_Scp_Data Storage - Fatal编程技术网

Bash 在创建文件并删除原始文件时,在远程主机上存储文件的最佳方式是什么?

Bash 在创建文件并删除原始文件时,在远程主机上存储文件的最佳方式是什么?,bash,backup,rsync,scp,data-storage,Bash,Backup,Rsync,Scp,Data Storage,基本上,我想在创建时将文件移动到另一台服务器,以保留目录结构。我有一个解决方案,它缺乏优雅。而且我觉得我错过了一个显而易见的答案,所以提前谢谢你的帮助,如果这让你感到厌烦,我完全理解 形势 我有一个磁盘空间有限的服务器,我们称之为“微型”和一个存储服务器。Tiny每隔一段时间创建一次文件。我想将它们自动存储在存储服务器上,并在安全的情况下删除原件。我必须保留tiny的目录结构。我事先不知道dir结构是什么样子的。也就是说,所有文件都是在/some/dir/目录中创建的,但其中的su目录是动态创建

基本上,我想在创建时将文件移动到另一台服务器,以保留目录结构。我有一个解决方案,它缺乏优雅。而且我觉得我错过了一个显而易见的答案,所以提前谢谢你的帮助,如果这让你感到厌烦,我完全理解

形势 我有一个磁盘空间有限的服务器,我们称之为“微型”和一个存储服务器。Tiny每隔一段时间创建一次文件。我想将它们自动存储在存储服务器上,并在安全的情况下删除原件。我必须保留tiny的目录结构。我事先不知道dir结构是什么样子的。也就是说,所有文件都是在/some/dir/目录中创建的,但其中的su目录是动态创建的。它们应该放在storege服务器上的/other/fold/中,并在/some/dir下保存子目录。例如:

/tiny-->上的某些/dir/bla/foo/bar/snap_001a变为存储服务器上的/other/fold/bla/foo/bar/snap_001a。它们都被称为snap_xxxx wgere xxxx是一个四个字母的字母数字字符串

我的老办法 现在我正在考虑循环文件并对其进行scp。一旦scp完成并无误返回,tiny上的文件将使用rm删除

然而,我觉得这是不必要的复杂,而且可能容易出错。我想到了rsync,但当处理单个文件时,没有选项创建目录,如果它们不存在,则创建父目录。有谁有比我更好的主意吗

在这个线程之后,我最终使用了什么 比我使用的版本更新的是take-remove源文件,而不是-remove发送的文件。前者更能说明问题,因为删除的文件更清晰。另外,在实际使用rsync之前,干运行是测试参数的一个很好的选择

感谢Alex Howansky的解决方案和Douglas Leeder的关心

如何让rsync只复制snap_xxxx文件

请参见-include选项

如何更改目录根

只需在命令行中指定它

rsync [options] source_dir dest_host:dest_dir
如何在传输到存储服务器后删除Tiny上的原件

请参见-删除源文件选项

如何让rsync只复制snap_xxxx文件

请参见-include选项

如何更改目录根

只需在命令行中指定它

rsync [options] source_dir dest_host:dest_dir
如何在传输到存储服务器后删除Tiny上的原件

请参阅-删除源文件选项。

可能类似于:

touch /tmp/start
rsync -va /some/dir/ /other/fold
find /some/dir -type f -not -newer /tmp/start | xargs rm
可能是这样的:

touch /tmp/start
rsync -va /some/dir/ /other/fold
find /some/dir -type f -not -newer /tmp/start | xargs rm

不要rsync单个文件,rsync树的根。它将找出更改的内容,只复制新内容,并自动创建所有子曲面。谢谢,但恐怕更复杂的是:如何让rsync只复制snap_xxxx文件?如何更改目录根?在传输到存储服务器后,如何删除Tiny上的原始文件?不要rsync单个文件,rsync树的根。它将找出更改的内容,只复制新内容,并自动创建所有子曲面。谢谢,但恐怕更复杂的是:如何让rsync只复制snap_xxxx文件?如何更改目录根?在传输到存储服务器后,如何删除Tiny上的原始文件?我想你的意思是-删除源文件?哇,奇怪-删除发送的文件可以正常工作,但没有文档记录。也许这是一个旧的选项,被重命名了,但为了向后兼容而保留了它?在任何情况下我都会更新答案。阅读变更日志,看起来它在2.6.9中被弃用了,但它仍然可以正常工作。看起来不错。另请参见-verbose和-dry run进行测试。我认为您需要说-include='*/'-include='snap'.*'-exclude='*'''.-删除空目录,包括文件夹、snap'.*文件,并排除所有其他内容,以及其中没有snap'.*文件的目录。我想您的意思是-删除源文件?哇,奇怪-删除发送的文件可以正常工作,但没有文档记录。也许这是一个旧的选项,被重命名了,但为了向后兼容而保留了它?在任何情况下我都会更新答案。阅读变更日志,看起来它在2.6.9中被弃用了,但它仍然可以正常工作。看起来不错。另请参见-verbose和-dry run进行测试。我认为您需要说-include='*/'-include='snap'-exclude='*'-prune空目录包括文件夹、snap'.*文件,并排除所有其他内容,以及那些原来没有snap'.*文件的目录。