技术解析

如何在 Linux 上实现两个本地目录的同步(或增量拷贝)?
0
2021-06-18 23:03:44
idczone

一台安装了 centos7 的电脑,有目录 A 和目录 B,目录 A 中有二三四级目录及文件若干,现需要每天将目录 A 中的所有文件增量同步到目录 B 中,使用 cp -nr 命令无法实现,请问如何解决?


rsync ?

rsync

cp -u

rsync
楼下请保持阵型

rsync

rsync

DRBD


rsync 不是用于远程-本地或本地-远程的嘛?本地-本地也可以实现?


rsync 骚操作大全系列之快速删除海量文件就是同步一个本地空目录.......

rsync 是为了网络传输设计的,本地-本地是顺带的。cp -u 和 rsync 没有实质区别。都不能保证 data consistency。
硬要说的话,cp 的 CPU 占用低一点儿……

张见识了,还有这种操作,,,,,,

我试了 cp -u ,但是发现,子目录里的文件依然没有被同步,我总觉得,cp 只看了下两个二级目录一样,然后对二级目录下面的三四级目录和文件就忽略过去了

https://github.com/azlux/log2ram/blob/master/log2ram#L23

你这是没有递归,再加上 -r 试试


-f 和-u 不会冲突嘛?
-f 是强制复制已存在,-u 是仅当文件更新或不存在时再复制。

我试了 cp -rn 但是没用

我刚才尝试执行 rsync -a /A /B ,我发现 rsync 在挨个对比每个在 B 目录中已存在的文件,对于 A 目录中存在 B 目录中不存在的文件视而不见,即使已经将这个目录对比完成了,也没有去将 B 目录不存在的文件从 A 目录复制到 B 目录。
另,是不是每次复制都要进行一次对比过程?因为 A 和 B 目录都很大,大小在 200+GB,如果每次都对比会不会太费资源了?

你 -rn 干嘛?你试试 cp -au doc/ doc-bak/ 进行单向增量备份,双向同步可以正反执行 2 次实现,我在 Ubuntu 18.04 测试时没问题的。#测试请前备份数据#

你这需求,象要一个 git

如果每次都对比会不会太费资源了?
省资源的话,需要做一个服务端,监控目录事件,收到事件后触发同步。

刚试过了,没用,几秒钟就结束了,然而该复制的文件一个都没有复制,你的目录结构可能比较简单,我这边可能是因为二级、三级、四级目录太多的原因吧,,,,
严重怀疑 cp 只是对比了一下二级目录的名字,发现一样,就认为两个目录是一样的。。

如果每次都对比会不会太费资源了?
你需要的是一个不耗资源的实时同步。

Linux 下 rsync+inotify 实现实时文件自动同步
https://www.linuxidc.com/Linux/2017-12/149355.htm
lsyncd —— 多机器实时同步文件神器
https://shockerli.net/post/linux-tool-lsyncd/

只从用了 NextCloud,干啥都用它。
两个机器都安装上客户端,同步吧,还带版本控制。

不会呀,我看了你的描述特地多建了几层目录测试,-au 没问题呀,你再测试试试,或者你的文件权限有没有啥问题呀

还有一个 Syncthing。
https://github.com/syncthing/syncthing

不是两个机器之间,是同一个机器上的两个目录

我又试了一次,将文件权限改为 775,用 root 复制,依然不行,,不知道问题出在哪

这太奇怪了呀,你不妨贴上终端的信息来看看,还有你输入的命令确定没有问题?比如命令中的路径使用 / 结尾或 /* 。

当我新建目录专门用来测试时,这个命令能成功完成,但是当我拿到生产环境执行时,就不行了,甚至我加上-v 时,也没有任何提示,就好像没有执行一样

命令如下
cp -auv /home/cx/图片 /run/media/toshiba/bak/图片

终端没有任何提示,直接就到下一个命令提示符了,如下:
cp -auv /home/cx/图片 /run/media/toshiba/bak/图片
#

ln -s 建立符号链接不行么?

我是用来备份文件的,但是又不想备份成 tar 等压缩格式,,

软链接不可以吗

看这路径,莫非是 NTFS、exFAT 文件系统的问题,生产环境中是否内核太久或未安装相关文件系统模块?

/home 是 xfs,/toshiba 是 ntfs,安装了 ntfs-3g,能正常访问和读写,初次向 /toshiba 目录复制时一切正常,从第二次就不行了,但是手动一个一个的复制依然能复制进去,说明硬盘好着呢,就是增量复制就不行了

看来可以结案了,还是暂时换掉 NTFS 吧,毕竟 ntfs-3g 兼容不全,cp 在处理 NTFS 文件时间戳时可能出了问题。要么在 NTFS 上 tar 打包试试,要么换 ext4 在 Windows 读取也有办法。rsync 貌似也可以忽略时间戳问题。

我试试,谢啦

新鲜出炉的 blog:[多平台实时同步方案比较]( https://c4ys.com/archives/2062)

rsync -avR this-linux:/path [email protected]:/
完全增量

用 rsync 吧,写个脚本以后要备份到远程说不定也可以用

linux rsync 非常好 windows 用 beyond compare

看了下你这个需求就是两个文件之间的增量数据同步问题,大家都把问题想复杂了。
其实很简单就可以完成你的要求
写一条 crontab 定时执行 cp 就好了,还是强制覆盖 B 目录文件
10 8 * * * cp -f 文件绝对路径 /A/* 文件绝对路径 /B/

没人推荐 syncthing 嘛,我自己用这个同步我自己电脑的文件到 nas,配置好以后不用管,有文件更改,自动同步。开源,免费,全平台。

linux 磁盘格式还是很重要的
一般我是 xfs 或是 ext4,其他的一般都不会选。

rsync

可以考虑 inotify 配合 rsync

initifywait+rsync

我的家用服务器就是 rsync 进行备份的

rsync

换个思路,用 git 或者 svn 本地仓库?

rsync +1,最好的易用的增量同步方案。

rsync 啊....


我前面推荐了啊,syncthing 全平台还差了一个 iOS,我的 blog 里面也有推荐 Seafile 和 nextcloud 倒是全平台的。

已拜读,我昨天用 rsync 解决了这个问题,问题本质是同一台机器里的两个不同目录之间的增量复制,但是由于两个目录分别位于两个硬盘上,源目录是 xfs 格式,目标目录是 ntfs,而 cp 在 ntfs 上有个时间戳问题,导致复制出错,而 rsync 不存在这个问题。

昨天用 rsync 解决了,备份到远程比这个容易,因为我一直以为 rsync 只能用于异地备份

cp 在不同文件系统中存在时间戳问题会导致复制出错,最后用 rsync 解决了

你可能理解错了,我这个需求是同一个机器上两个不同目录之间的同步,现已经用 rsync 解决了

本地磁盘都是 xfs,而那个 ntfs 是移动硬盘,要在不同的地方读取,为了方便,就用了 ntfs

用 rsync 已经解决了,等下次再有类似需求的时候试试 git

lftp

我也有这个需求,完全小白,能说说你的具体指令吗?
我是 nas 只有两个盘位,只想某个文件夹下的内容 两块硬盘都备份,这样节省空间。


rsync -vurtopg /源目录 /目标目录

ln -s A B
软连接不就解决了吗

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服