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

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

  •  
  •   yao990 · 27 天前 · 4516 次点击

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

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

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

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

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


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

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

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

    我是 nas 只有两个盘位,只想某个文件夹下的内容 两块硬盘都备份,这样节省空间。
    yao990
        63
    yao990   18 天前 via Android
    @firhome
    rsync -vurtopg /源目录 /目标目录
    zooqkl01
        64
    zooqkl01   4 天前
    ln -s A B
    软连接不就解决了吗
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2900 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 14:27 · PVG 22:27 · LAX 07:27 · JFK 10:27
    ♥ Do have faith in what you're doing.