Rsync的一个高级应用

发布时间 2023-04-23 07:45:16作者: 济南小老虎

Rsync的一个高级应用


背景

2019年刚开始接触linux时. 有一个很恶心的场景. 
很多人为了简单起见, 提交数据库的修改(数据结果和预制数据)
都不是增量处理, 都是全量提交过来. 
所以会造成修改越来越多的, 速度越来越慢的情况. 
当时自己就在网上找资料,发现了一个解决方案, 就是利用rsync进行一系列的对比与查找,将文件按照目录到指定路径下.

这样有一个好处. 应用的话 我就知道哪一些文件发生了变化, 进而推动了我这边镜像分层.动态生成加快生成速度的想法
另外一方面非应用 数据库部分就可以利用这个方式仅更新变化的部分. 

命令解析

最原始的作者:
https://my.oschina.net/mengshuai/blog/551379
原作者是 2015年写的文章. 我应该死2019年发现的这个地方.
然后用来进行过一些处理. 

rsync -rcn --out-format="%n"  /myapp/${before}/  /myapp/${now}/ |grep -v "/$"|xargs -I{} rsync -R /myapp/${now}/./{} /myapp/diff${now}/new


这是一个rsync的命令,实现的功能是将从源目录/myapp/${before}/到目标目录/myapp/${now}/之间差异
的文件复制到/myapp/diff${now}/old目录中。下面是具体命令中各选项的含义:

--dry-run:显示这个命令将做的事情,但是不实际操作。
-r:递归复制子目录,保持目录结构。
-C: cvs相关的文件不进行备份恢复, 原始的命令来里面带这个, 我这边不是源码, 是反编译后的,所以需要带着. 
-c:根据文件的check-sum比对文件内容是否有修改, 快速确定是否需要同步更新。
-n:模拟执行,不进行实际操作。
--out-format="%n":输出修改或已存在于目标位置的文件名。
/myapp/${before}/:源目录路径变量 ${before} 对应某个目录。
/myapp/${now}/:目标目录路径变量 ${now} 对应某个目录。
grep -v "/$":过滤掉grep命令中以斜杠(/)结尾的行,剩余的行即为需要同步的文件,而不包括目录。
xargs -i{} rsync -r /myapp/${before}/./{} /myapp/diff${now}/old:使用xargs将需要同步的文件名作为参数传递给rsync命令,
并根据路径和文件名,把旧版本的文件复制到指定目录/myapp/diff${now}/old 的相对位置。
其中 {} 为zarfs占位符变量,用以读取从上一行 grep -v "/$"得到的源目录文件名列表中每行文件名。

命名说明

上一个命令解析其实是 chatgpt 给解析的.
其实我也尝试过, 自己也可以将命令准确的进行解释. 

chatgpt 的确是一个生产力工具. 
但是我感觉还是尽量能够有自己的思维去理解会更好一些. 

grep xargs rsync 其实都是自己常用的命令.  理论上自己也可以写的出来
还是要加强自己的学习.