如何在 Linux 上实现两个本地目录的同步(或增量拷贝)? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
yao990
V2EX    Linux

如何在 Linux 上实现两个本地目录的同步(或增量拷贝)?

  •  
  •   yao990 2020-03-01 17:06:27 +08:00 13967 次点击
    这是一个创建于 2050 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    64 条回复    2020-03-24 11:33:20 +08:00
    momocraft
        1
    momocraft  
       2020-03-01 17:08:38 +08:00
    rsync ?
    misaka19000
        2
    misaka19000  
       2020-03-01 17:08:58 +08:00
    rsync
    xupefei
        3
    xupefei  
       2020-03-01 17:10:27 +08:00
    cp -u
    Enya
        4
    Enya  
       2020-03-01 17:10:28 +08:00 via iPhone
    rsync
    楼下请保持阵型
    nita22
        5
    nita22  
       2020-03-01 17:11:10 +08:00
    rsync
    leoleoasd
        6
    leoleoasd  
       2020-03-01 17:14:58 +08:00
    rsync
    westoy
        7
    westoy  
       2020-03-01 17:16:54 +08:00
    DRBD
    yao990
        8
    yao990  
    OP
       2020-03-01 17:20:03 +08:00
    @Enya @leoleoasd @misaka19000 @momocraft @nita22 @xupefei
    rsync 不是用于远程-本地或本地-远程的嘛?本地-本地也可以实现?
    westoy
        9
    westoy  
       2020-03-01 17:24:15 +08:00   2
    @yao990

    rsync 骚操作大全系列之快速删除海量文件就是同步一个本地空目录.......
    xupefei
        10
    xupefei  
       2020-03-01 17:30:04 +08:00   1
    @yao990 rsync 是为了网络传输设计的,本地-本地是顺带的。cp -u 和 rsync 没有实质区别。都不能保证 data consistency。
    硬要说的话,cp 的 CPU 占用低一点儿……
    yao990
        11
    yao990  
    OP
       2020-03-01 17:30:58 +08:00
    @westoy 张见识了,还有这种操作,,,,,,
    yao990
        12
    yao990  
    OP
       2020-03-01 17:48:44 +08:00
    @xupefei 我试了 cp -u ,但是发现,子目录里的文件依然没有被同步,我总觉得,cp 只看了下两个二级目录一样,然后对二级目录下面的三四级目录和文件就忽略过去了
    xupefei
        13
    xupefei  
       2020-03-01 18:03:53 +08:00
    cev2
        14
    cev2  
       2020-03-01 18:18:42 +08:00
    @yao990 你这是没有递归,再加上 -r 试试
    yao990
        15
    yao990  
    OP
       2020-03-01 18:34:03 +08:00
    @xupefei
    -f 和-u 不会冲突嘛?
    -f 是强制复制已存在,-u 是仅当文件更新或不存在时再复制。
    yao990
        16
    yao990  
    OP
       2020-03-01 18:35:15 +08:00
    @cexid 我试了 cp -rn 但是没用
    yao990
        17
    yao990  
    OP
       2020-03-01 18:45:10 +08:00
    @westoy 我刚才尝试执行 rsync -a /A /B ,我发现 rsync 在挨个对比每个在 B 目录中已存在的文件,对于 A 目录中存在 B 目录中不存在的文件视而不见,即使已经将这个目录对比完成了,也没有去将 B 目录不存在的文件从 A 目录复制到 B 目录。
    另,是不是每次复制都要进行一次对比过程?因为 A 和 B 目录都很大,大小在 200+GB,如果每次都对比会不会太费资源了?
    cev2
        18
    cev2  
       2020-03-01 18:50:55 +08:00
    @yao990 #14 #16 你 -rn 干嘛?你试试 cp -au doc/ doc-bak/ 进行单向增量备份,双向同步可以正反执行 2 次实现,我在 Ubuntu 18.04 测试时没问题的。#测试请前备份数据#
    encro
        19
    encro  
       2020-03-01 18:53:07 +08:00
    你这需求,象要一个 git
    encro
        20
    encro  
       2020-03-01 18:56:31 +08:00
    如果每次都对比会不会太费资源了?

    省资源的话,需要做一个服务端,监控目录事件,收到事件后触发同步。
    yao990
        21
    yao990  
    OP
       2020-03-01 18:59:19 +08:00
    @cexid 刚试过了,没用,几秒钟就结束了,然而该复制的文件一个都没有复制,你的目录结构可能比较简单,我这边可能是因为二级、三级、四级目录太多的原因吧,,,,
    严重怀疑 cp 只是对比了一下二级目录的名字,发现一样,就认为两个目录是一样的。。
    encro
        22
    encro  
       2020-03-01 19:00:49 +08:00
    如果每次都对比会不会太费资源了?

    你需要的是一个不耗资源的实时同步。


    Linux 下 rsync+inotify 实现实时文件自动同步
    https://www.linuxidc.com/Linux/2017-12/149355.htm

    lsyncd 多机器实时同步文件神器
    https://shockerli.net/post/linux-tool-lsyncd/
    link0502
        23
    link0502  
       2020-03-01 19:01:34 +08:00
    只从用了 NextCloud,干啥都用它。
    两个机器都安装上客户端,同步吧,还带版本控制。
    cev2
        24
    cev2  
       2020-03-01 19:03:29 +08:00
    @yao990 不会呀,我看了你的描述特地多建了几层目录测试,-au 没问题呀,你再测试试试,或者你的文件权限有没有啥问题呀
    encro
        25
    encro  
       2020-03-01 19:04:37 +08:00
    yao990
        26
    yao990  
    OP
       2020-03-01 19:10:27 +08:00
    @link0502 不是两个机器之间,是同一个机器上的两个目录
    yao990
        27
    yao990  
    OP
       2020-03-01 19:20:57 +08:00
    @cexid 我又试了一次,将文件权限改为 775,用 root 复制,依然不行,,不知道问题出在哪
    cev2
        28
    cev2  
       2020-03-01 19:31:30 +08:00
    @yao990 这太奇怪了呀,你不妨贴上终端的信息来看看,还有你输入的命令确定没有问题?比如命令中的路径使用 / 结尾或 /* 。
    yao990
        29
    yao990  
    OP
       2020-03-01 19:38:55 +08:00
    @cexid 当我新建目录专门用来测试时,这个命令能成功完成,但是当我拿到生产环境执行时,就不行了,甚至我加上-v 时,也没有任何提示,就好像没有执行一样
    yao990
        30
    yao990  
    OP
       2020-03-01 19:40:40 +08:00
    @cexid 命令如下
    # cp -auv /home/cx/图片 /run/media/toshiba/bak/图片
    yao990
        31
    yao990  
    OP
       2020-03-01 19:41:57 +08:00
    @cexid 终端没有任何提示,直接就到下一个命令提示符了,如下:
    # cp -auv /home/cx/图片 /run/media/toshiba/bak/图片
    #
    yixiang
        32
    yixiang  
       2020-03-01 19:42:29 +08:00
    ln -s 建立符号链接不行么?
    yao990
        33
    yao990  
    OP
       2020-03-01 19:48:04 +08:00
    @yixiang 我是用来备份文件的,但是又不想备份成 tar 等压缩格式,,
    zmxnv123
        34
    zmxnv123  
       2020-03-01 19:48:05 +08:00
    软链接不可以吗
    cev2
        35
    cev2  
       2020-03-01 19:58:47 +08:00
    @yao990 看这路径,莫非是 NTFS、exFAT 文件系统的问题,生产环境中是否内核太久或未安装相关文件系统模块?
    yao990
        36
    yao990  
    OP
       2020-03-01 20:08:14 +08:00
    @cexid /home 是 xfs,/toshiba 是 ntfs,安装了 ntfs-3g,能正常访问和读写,初次向 /toshiba 目录复制时一切正常,从第二次就不行了,但是手动一个一个的复制依然能复制进去,说明硬盘好着呢,就是增量复制就不行了
    cev2
        37
    cev2  
       2020-03-01 20:19:22 +08:00
    @yao990 看来可以结案了,还是暂时换掉 NTFS 吧,毕竟 ntfs-3g 兼容不全,cp 在处理 NTFS 文件时间戳时可能出了问题。要么在 NTFS 上 tar 打包试试,要么换 ext4 在 Windows 读取也有办法。rsync 貌似也可以忽略时间戳问题。
    yao990
        38
    yao990  
    OP
       2020-03-01 20:24:52 +08:00 via Android
    @cexid 我试试,谢啦
    encro
        39
    encro  
       2020-03-01 20:55:39 +08:00
    新鲜出炉的 blog:[多平台实时同步方案比较]( https://c4ys.com/archives/2062)
    429463267
        40
    429463267  
       2020-03-01 21:11:53 +08:00
    rsync -avR this-linux:/path user@that-linux:/

    完全增量
    April5
        41
    April5  
       2020-03-01 23:09:02 +08:00
    用 rsync 吧,写个脚本以后要备份到远程说不定也可以用
    jin7
        42
    jin7  
       2020-03-01 23:17:55 +08:00
    linux rsync 非常好 windows 用 beyond compare
    longyueshier
        43
    longyueshier  
       2020-03-01 23:25:41 +08:00
    看了下你这个需求就是两个文件之间的增量数据同步问题,大家都把问题想复杂了。
    其实很简单就可以完成你的要求
    写一条 crontab 定时执行 cp 就好了,还是强制覆盖 B 目录文件
    10 8 * * * cp -f 文件绝对路径 /A/* 文件绝对路径 /B/
    july1995
        44
    july1995  
       2020-03-01 23:38:23 +08:00 via iPhone   1
    没人推荐 syncthing 嘛,我自己用这个同步我自己电脑的文件到 nas,配置好以后不用管,有文件更改,自动同步。开源,免费,全平台。
    flowercoder
        45
    flowercoder  
       2020-03-02 00:24:22 +08:00
    linux 磁盘格式还是很重要的
    一般我是 xfs 或是 ext4,其他的一般都不会选。
    1nakaELYBbsXbZxY
        46
    1nakaELYBbsXbZxY  
       2020-03-02 00:42:56 +08:00
    rsync
    xiaobai555
        47
    xiaobai555  
       2020-03-02 07:12:54 +08:00 via Android
    可以考虑 inotify 配合 rsync
    littlezzll
        48
    littlezzll  
       2020-03-02 08:20:05 +08:00 via Android
    initifywait+rsync
    fox0001
        49
    fox0001  
       2020-03-02 08:58:05 +08:00 via Android
    我的家用服务器就是 rsync 进行备份的
    RRRoger
        50
    RRRoger  
       2020-03-02 09:49:05 +08:00
    rsync
    fitmewell
        51
    fitmewell  
       2020-03-02 09:54:04 +08:00 via Android
    换个思路,用 git 或者 svn 本地仓库?
    faywong8888
        52
    faywong8888  
       2020-03-02 11:28:24 +08:00
    rsync +1,最好的易用的增量同步方案。
    CasparLi
        53
    CasparLi  
       2020-03-02 11:52:32 +08:00
    rsync 啊....
    encro
        54
    encro  
       2020-03-02 12:05:53 +08:00
    @july1995
    我前面推荐了啊,syncthing 全平台还差了一个 iOS,我的 blog 里面也有推荐 Seafile 和 nextcloud 倒是全平台的。
    yao990
        55
    yao990  
    OP
       2020-03-02 16:51:39 +08:00 via Android
    @encro 已拜读,我昨天用 rsync 解决了这个问题,问题本质是同一台机器里的两个不同目录之间的增量复制,但是由于两个目录分别位于两个硬盘上,源目录是 xfs 格式,目标目录是 ntfs,而 cp 在 ntfs 上有个时间戳问题,导致复制出错,而 rsync 不存在这个问题。
    yao990
        56
    yao990  
    OP
       2020-03-02 16:52:59 +08:00 via Android
    @April5 昨天用 rsync 解决了,备份到远程比这个容易,因为我一直以为 rsync 只能用于异地备份
    yao990
        57
    yao990  
    OP
       2020-03-02 16:53:50 +08:00 via Android
    @longyueshier cp 在不同文件系统中存在时间戳问题会导致复制出错,最后用 rsync 解决了
    yao990
        58
    yao990  
    OP
       2020-03-02 16:54:35 +08:00 via Android
    @july1995 你可能理解错了,我这个需求是同一个机器上两个不同目录之间的同步,现已经用 rsync 解决了
    yao990
        59
    yao990  
    OP
       2020-03-02 16:55:50 +08:00 via Android
    @flowercoder 本地磁盘都是 xfs,而那个 ntfs 是移动硬盘,要在不同的地方读取,为了方便,就用了 ntfs
    yao990
        60
    yao990  
    OP
       2020-03-02 16:56:35 +08:00 via Android
    @fitmewell 用 rsync 已经解决了,等下次再有类似需求的时候试试 git
    catcalse
        61
    catcalse  
       2020-03-03 13:24:12 +08:00
    lftp
    firhome
        62
    firhome  
       2020-03-10 20:45:45 +08:00
    @yao990 我也有这个需求,完全小白,能说说你的具体指令吗?

    我是 nas 只有两个盘位,只想某个文件夹下的内容 两块硬盘都备份,这样节省空间。
    yao990
        63
    yao990  
    OP
       2020-03-10 21:30:08 +08:00 via Android
    @firhome
    rsync -vurtopg /源目录 /目标目录
    zooqkl01
        64
    zooqkl01  
       2020-03-24 11:33:20 +08:00
    ln -s A B
    软连接不就解决了吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5376 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 09:13 PVG 17:13 LAX 02:13 JFK 05:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86