Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
yao990
V2EX  ›  Linux

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

  •  
  •   yao990 · Mar 1, 2020 · 15277 views
    This topic created in 2439 days ago, the information mentioned may be changed or developed.

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

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

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

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

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


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

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

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

    我是 nas 只有两个盘位,只想某个文件夹下的内容 两块硬盘都备份,这样节省空间。
    yao990
    yao990
    OP
    Mar 10, 2020 via Android
    63
    @firhome
    rsync -vurtopg /源目录 /目标目录
    zooqkl01
    zooqkl01
    Mar 24, 2020
    64
    ln -s A B
    软连接不就解决了吗
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2765 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 76ms · UTC 14:35 · PVG 22:35 · LAX 06:35 · JFK 09:35
    ♥ Do have faith in what you're doing.