正文
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 其实都是自己常用的命令. 理论上自己也可以写的出来
还是要加强自己的学习.