V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
yao990
V2EX  ›  Linux

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

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

    一台安装了 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,其他的一般都不会选。
    mmixxia
        46
    mmixxia  
       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   ·   实用小工具   ·   5730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 03:06 · PVG 11:06 · LAX 19:06 · JFK 22:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.