zoukankan      html  css  js  c++  java
  • rsync的相关使用,参数设置。

    前期拷贝文件一直用scp,其实也绝的蛮好用的,最近想拷贝一份脚本到服务器,本地是用python -m在脚本目录创建了.venv的Python运行环境文件。

    但经过多次测试,该环境想直接拷贝到服务器上面使用无法实现,只能曲线服务器上还是用virtualenvwrapper的虚拟环境。

    所以文件传输到服务器的过程中,我想过滤.venv文件,发现scp无此功能,查找相关资料后发现了,rsync命令,功能非常强大,准备相关资料运行部分指令。

    Rsync是一款通过网络备份重要数据的工具/软件。它同样是一个在类Unix和Window系统上通过网络在系统间同步文件夹和文件的网络协议。Rsync可以复制或者显示目录并复制文件。Rsync默认监听TCP 873端口,通过远程shell如rsh和ssh复制文件。Rsync必须在远程和本地系统上都安装。

    rsync的目的是实现本地主机和远程主机上的文件同步(包括本地推到远程,远程拉到本地两种同步方式),也可以实现本地不同路径下文件的同步,(重点)但不能实现远程路径1到远程路径2之间的同步(scp可以实现)。

    以下是rsync的语法:

    Local:  rsync [OPTION...] SRC... [DEST]
     
    Access via remote shell:
      Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
      Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
     
    Access via rsync daemon:
      Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
            rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
      Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
            rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

    由此语法可知,rsync有三种工作方式:

    (1).本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

    (2).本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

    (3).本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

     

    其中,第一个路径参数一定是源文件路径,即作为同步基准的一方,可以同时指定多个源文件路径。最后一个路径参数则是目标文件路径,也就是待同步方。路径的格式可以是本地路径,也可以是使用user@host:path或user@host::path的远程路径,如果主机和path路径之间使用单个冒号隔开,表示使用的是远程shell通信方式,而使用双冒号隔开的则表示的是连接rsync daemon。另外,连接rsync daemon时,还提供了URL格式的路径表述方式rsync://user@host/path。

    如果仅有一个SRC或DEST参数,则将以类似于"ls -l"的方式列出源文件列表(只有一个路径参数,总会认为是源文件),而不是复制文件。

    查看本地文件

    [root@instance-erv5z0qp ~]# rsync test
    drwxr-xr-x          4,096 2019/10/29 16:46:08 test
    [root@instance-erv5z0qp ~]# ll test/
    总用量 0
    -rw-r--r-- 1 root root 0 10月 29 16:46 1
    -rw-r--r-- 1 root root 0 10月 29 16:46 2
    -rw-r--r-- 1 root root 0 10月 29 16:46 3

    远程查看服务器文件。

    shijianongdeMBP:new3_report shijianzhong$ rsync baidu:/root    
    dr-xr-x---        4096 2019/10/29 16:46:00 root
    shijianongdeMBP:new3_report shijianzhong$ rsync baidu:/root/
    dr-xr-x---        4096 2019/10/29 16:46:00 .
    -rw-------         464 2019/10/29 16:46:46 .bash_history
    -rw-r--r--          18 2013/12/29 10:26:31 .bash_logout
    -rw-r--r--         176 2013/12/29 10:26:31 .bash_profile
    -rw-r--r--         176 2013/12/29 10:26:31 .bashrc
    -rw-r--r--         100 2013/12/29 10:26:31 .cshrc
    -rw-r--r--         129 2013/12/29 10:26:31 .tcshrc
    -rw-r--r--           0 2019/10/29 16:45:39 1
    -rw-r--r--           0 2019/10/29 16:45:39 2
    -rw-r--r--           0 2019/10/29 16:45:39 3
    drwxr-xr-x        4096 2019/10/29 16:20:11 .cache
    drwxr-xr-x        4096 2019/10/29 16:20:11 .config
    drwx------        4096 2019/10/29 16:17:37 .ssh
    drwxr-xr-x        4096 2019/10/29 16:46:08 test

    [root@xuexi ~]# rsync /etc/fstab /tmp                # 在本地同步
    [root@xuexi ~]# rsync -r /etc 172.16.10.5:/tmp       # 将本地/etc目录拷贝到远程主机的/tmp下,以保证远程/tmp目录和本地/etc保持同步
    [root@xuexi ~]# rsync -r 172.16.10.5:/etc /tmp       # 将远程主机的/etc目录拷贝到本地/tmp下,以保证本地/tmp目录和远程/etc保持同步
    [root@xuexi ~]# rsync /etc/                          # 列出本地/etc/目录下的文件列表
    [root@xuexi ~]# rsync 172.16.10.5:/tmp/              # 列出远程主机上/tmp/目录下的文件列表


    另外,使用rsync一定要注意的一点是,源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。例如:

    [root@xuexi ~]# rsync -a /etc /tmp
    [root@xuexi ~]# rsync -a /etc/ /tmp

    第一个命令会在/tmp目录下创建etc目录(文件也同时拷贝过来),而第二个命令不会在/tmp目录下创建etc目录,源路径/etc/中的所有文件都直接放在/tmp目录下。

     

    接下来是rsync的选项说明。

    -v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
    -P:显示文件传输的进度信息。(实际上"-P"="--partial --progress",其中的"--progress"才是显示进度信息的)。
    -n --dry-run  :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
    -a --archive  :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
    -r --recursive:递归到目录中去。
    -t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系统时间,导致下次更新
              :检查出mtime不同从而导致增量传输无效。
    -o --owner:保持owner属性(属主)。
    -g --group:保持group属性(属组)。
    -p --perms:保持perms属性(权限,不包括特殊权限)。
    -D        :是"--device --specials"选项的组合,即也拷贝设备文件和特殊文件。
    -l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
    -z        :传输时进行压缩提高效率。
    -R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送给服务端,包括它们的属性。用法见下文示例。
    --size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
    -u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判断的,不会影响删除行为。
    -d --dirs   :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝dir1目录,使用该选项将拷贝dir1但不拷贝file1。
    --max-size  :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如:"--max-size=1.5m")
    --min-size  :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
    --exclude   :指定排除规则来排除不需要传输的文件。
    --delete    :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"--delete"是在接收端执行的,所以它是在
                :exclude/include规则生效之后才执行的。
    -b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~"做后缀。
    --backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
    -e          :指定所要使用的远程shell程序,默认为ssh。
    --port      :连接daemon时使用的端口号,默认为873端口。
    --password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是远程shell认证的密码,而是rsync模块认证的密码。
    -W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该选项比增量传输更高效。
    --existing  :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相对路径时如果上层目录不存在也不会传输。
    --ignore-existing:要求只更新目标端不存在的文件。和"--existing"结合使用有特殊功能,见下文示例。
    --remove-source-files:要求删除源端已经成功传输的文件。

    rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项,关于更完整更详细的选项说明,见我的rsync man手册翻译

    虽然选项非常多,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。

     

    (1).将/etc/fstab拷贝到/tmp目录下。

    [root@xuexi ~]# rsync /etc/fstab /tmp

    (2).将/etc/cron.d目录拷贝到/tmp下。

    [root@xuexi ~]# rsync -r /etc/cron.d /tmp

    该命令会在目标主机上创建/tmp/cron.d目录,并将/etc/cron.d/中的文件放入到/tmp/cron.d/目录中,也就是说默认情况下,是不会在目录路径下创建上层目录/etc的。

    (3).将/etc/cron.d目录拷贝到/tmp下,但要求在/tmp下也生成etc子目录。

    [root@xuexi ~]# rsync -R -r /etc/cron.d /tmp

    其中"-R"选项表示使用相对路径,此相对路径是以目标目录为根的。对于上面的示例,表示在目标上的/tmp下创建etc/cron.d目录,即/tmp/etc/cron.d,etc/cron.d的根"/"代表的就是目标/tmp。

    [root@instance-erv5z0qp ~]# rsync -r /etc/cron.d /tmp/
    [root@instance-erv5z0qp ~]# ls /tmp/
    cron.d
    [root@instance-erv5z0qp ~]# rsync -R -r /etc/cron.d /tmp/
    [root@instance-erv5z0qp ~]# ls /tmp/
    cron.d  etc
    [root@instance-erv5z0qp ~]#

    如果要拷贝的源路径较长,但只想在目标主机上保留一部分目录结构,例如要拷贝/var/log/anaconda/*到/tmp下,但只想在/tmp下保留从log开始的目录,如何操作?使用一个点代表相对路径的起始位置即可,也就是将长目录进行划分。

    [root@xuexi ~]# rsync -R -r /var/./log/anaconda /tmp

    这样,从点开始的目录都是相对路径,其相对根目录为目标路径。所以对于上面的示例,将在目标上创建/tmp/log/anaconda/*。

    (4).对远程目录下已存在文件做一个备份。

    [root@xuexi ~]# rsync -R -r --backup /var/./log/anaconda /tmp

    这样在目标目录下,已存在的文件就被做一个备份,备份文件默认使用"~"做后缀,可以使用"--suffix"指定备份后缀。

    [root@xuexi tmp]# ll log/anaconda/
    total 3112
    -rw------- 1 root root    6668 Jul 14 12:45 anaconda.log
    -rw------- 1 root root    6668 Jul 14 11:44 anaconda.log~
    -rw------- 1 root root    3826 Jul 14 12:45 ifcfg.log
    -rw------- 1 root root    3826 Jul 14 11:44 ifcfg.log~
    -rw------- 1 root root 1102699 Jul 14 12:45 journal.log
    -rw------- 1 root root 1102699 Jul 14 11:44 journal.log~
    -rw------- 1 root root       0 Jul 14 12:45 ks-script-1uLekR.log
    -rw------- 1 root root       0 Jul 14 11:44 ks-script-1uLekR.log~
    -rw------- 1 root root       0 Jul 14 12:45 ks-script-iGpl4q.log
    -rw------- 1 root root       0 Jul 14 11:44 ks-script-iGpl4q.log~
    -rw------- 1 root root  160420 Jul 14 12:45 packaging.log
    -rw------- 1 root root  160420 Jul 14 11:44 packaging.log~
    -rw------- 1 root root   27906 Jul 14 12:45 program.log
    -rw------- 1 root root   27906 Jul 14 11:44 program.log~
    -rw------- 1 root root   78001 Jul 14 12:45 storage.log
    -rw------- 1 root root   78001 Jul 14 11:44 storage.log~
    -rw------- 1 root root  197961 Jul 14 12:45 syslog
    -rw------- 1 root root  197961 Jul 14 11:44 syslog~

    可以使用"--backup-dir"指定备份文件保存路径,但要求保存路径必须存在。

    [root@xuexi ~]# mkdir /tmp/log_back
    
    [root@xuexi ~]# rsync -R -r --backup --backup-dir=/tmp/log_back /var/./log/anaconda /tmp

    指定备份路径后,默认将不会加备份后缀,除非使用"--suffix"显式指定后缀,如"--suffix=~"。

    [root@xuexi tmp]# tree /tmp/log_back/
    /tmp/log_back/
    └── log
        └── anaconda
            ├── anaconda.log
            ├── ifcfg.log
            ├── journal.log
            ├── ks-script-1uLekR.log
            ├── ks-script-iGpl4q.log
            ├── packaging.log
            ├── program.log
            ├── storage.log
            └── syslog

    备份文件时候,需要首相拷贝一份文件,在有原文的基础上面才能实现备份。

    如果第一次就执行--backup就是简单的复制文件。

    [root@instance-erv5z0qp ~]# rsync -r /root /tmp/
    [root@instance-erv5z0qp ~]# tree /tmp/
    /tmp/
    └── root
        ├── 1
        ├── 2
        ├── 3
        └── test
            ├── 1
            ├── 2
            └── 3

    2 directories, 6 files
    [root@instance-erv5z0qp ~]# rsync -r --backup /root /tmp/
    [root@instance-erv5z0qp ~]# tree /tmp/
    /tmp/
    └── root
        ├── 1
        ├── 1~
        ├── 2
        ├── 2~
        ├── 3
        ├── 3~
        └── test
            ├── 1
            ├── 1~
            ├── 2
            ├── 2~
            ├── 3
            └── 3~


    "--existing"和"--ignore-existing"

    其实这个还是比较好理解的,我就不复制了,

    --existing就是就是只拷贝目标文件夹里面有的文件,如果目标文件夹里面没有的不复制过去

    --ignore-extsting字面意思就是忽悠存在的,眼下之意就是只复制目标文件夹不存在的文件。

    后面我自己演示下。

     mkdir {a,b};touch a/{1,2,3}
    [root@instance-erv5z0qp ~]# ls a
    1  2  3
    [root@instance-erv5z0qp ~]# ls b
    [root@instance-erv5z0qp ~]# touch b/{2,3,4,5}
    [root@instance-erv5z0qp ~]# rsync -rv --existing a/ b
    sending incremental file list
    2
    3

    sent 156 bytes  received 54 bytes  420.00 bytes/sec
    total size is 0  speedup is 0.00
    目标文件有2,3,4,5,源文件只有2,3,所有只复制了2,3相当于复制了交集的文件。

    [root@instance-erv5z0qp ~]# rsync -rv --ignore-existing a/ b
    sending incremental file list
    1

    sent 117 bytes  received 35 bytes  304.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@instance-erv5z0qp ~]# ls b
    1  2  3  4  5
    目标文件里面与源文件的差集为1,所有只有1复制给了目标文件,另外的文件没动。

     

    rsync -rv --delete a/ b
    sending incremental file list
    deleting 5
    deleting 4
    1
    2
    3

    sent 195 bytes  received 83 bytes  556.00 bytes/sec
    total size is 0  speedup is 0.00

    上面演示的--delete的效果,目标文件将于源文件对比,目标文件中多的文件将被删除,而且目标文件中与源文件总重复的文件将被重新被源文件覆盖。

    如果你只想对比删除目标文件中多的文件,但不想对目标文件进行任何添加修改文件,可以加上--existing --ignore-existing 来进行约束。

    [root@instance-erv5z0qp ~]# ls {a,b}
    a:
    1  2  3  4

    b:
    1  2  3  5
    [root@instance-erv5z0qp ~]# rsync -rv --existing --ignore-existing  a/ b
    sending incremental file list

    sent 97 bytes  received 12 bytes  218.00 bytes/sec
    total size is 4  speedup is 0.04

    上面对a,b两个文件夹进行了限制操作,但双方文件都没有变动。

     

    rsync -rv --existing --ignore-existing  --delete a/ b
    sending incremental file list
    deleting 5

    sent 97 bytes  received 17 bytes  228.00 bytes/sec
    total size is 4  speedup is 0.04

     

    添加--delete后,对b中比a多的5号文件删除,另外文件都没有进行操作。

     

    "--remove-source-files"删除源端文件。

    使用该选项后,源端已经更新成功的文件都会被删除,源端所有未传输或未传输成功的文件都不会被移除。未传输成功的原因有多种,如exclude排除了,"quick check"未选项该文件,传输中断等等。

    [root@instance-erv5z0qp ~]# ls {a,b}
    a:
    1  2  3  4

    b:
    [root@instance-erv5z0qp ~]# rsync -rv --remove-source-files a/* b
    sending incremental file list
    1
    2
    3
    4

    sent 246 bytes  received 124 bytes  740.00 bytes/sec
    total size is 4  speedup is 0.01
    [root@instance-erv5z0qp ~]# ll {a,b}
    a:
    总用量 0

    b:
    总用量 8
    -rw-r--r-- 1 root root 2 10月 29 23:08 1
    -rw-r--r-- 1 root root 2 10月 29 23:08 2
    -rw-r--r-- 1 root root 0 10月 29 23:08 3
    -rw-r--r-- 1 root root 0 10月 29 23:08 4

    根据实际操作发现,这个有点想mv的效果,暂时没发现什么区别。

     

    我的重点学习东西来的,"--exclude"排除规则

    使用"--exclude"选项指定排除规则,排除那些不需要传输的文件。

    这是一个非常好用的命令,让你复制,传输文件中能够过滤自己想过滤的文件。

     

    我测试所用的路径都是相对路径

    rsync -zvr --exclude=".*" new3_report tx:/home/sidian

     

    这是对我的tx服务器传输文件,因为文件里面有.git相关资料,以及.venv的虚拟环境不需要上传到服务器,所有我就忽略了所有点开头的文件。

    里面填写的过滤文件或文件夹就是源文件夹里面的名称,文件与文件名一样,直接填写名字,如果用绝对路径经过多次测试,失败。

    这里我重点给自己提示下,假如我想过滤.venv下面的txt文件,这个时候我需要在--exclude=".venv/*.txt"这样才可以,如果是你复制文件夹的根目录就不要添加路径,我试过添加绝对路径也不行。

     

    rsync -aAXhv --exclude={"/var/cache","/var/tmp"} /var /home/root/var

    在根目录下复制相关文件可以直接添加根目录路径,前后全部写了根目录,实际操作是实现结果。

    上面的案例让我很迷惑,按照我的写法,应该写成?????????

    rsync -aAXhv --exclude={"cache","tmp"} /var /home/root/var

    才能实现该过滤,前面我自己测试写过几个过滤,基本写绝对路径的全部不行,但这个也比较特殊,他备份的就是根目录文件。

    这个让我很疑惑,反正我后面应该不会写绝对路径

     

    下面是源作者对于路径的解释,我测试了以后作者的方法还是可以实现的,但更加方便的是,无论是备份文件(不包含源文件目录后面不带/),或者文件内的内容(源目录后面带/),

    如果你想过滤源文件内的内容前面不添加路径都能实现过滤的功能,除非你要向子目录过滤才需要在后面添加/,重点的重点就是--exclude后面跟的最高文件位置路径就是源文件夹内的文件。

    无论你备份的时候源文件带与不带/

     

    经过后续的调试,发现如果在备份的时候尽量带文件名拷贝,因为这样的话,假如你要筛选文件目录下的.txt会比较好使,直接--exclude="/源文件名/*.txt",可以定位到就过滤源文件名下面的.txt

    文件,里面的自文件夹下面的.txt文件不收影响,但如果你用了/拷贝的话,我测试无法定位源文件名下面的(批量文件或目录),直接写--exclude="/源文件名/*.txt"过滤无效,写--exclude="*.txt",会把里面所有的文件.txt全部过滤了

    ,所以最后尽然要推翻前面的推断,拷贝推荐用带源文件目录拷贝,过滤建议带上源文件名,精准过滤。

     

    推荐写法 rsync -zvr --exclude={"test/*.txt","test/log/.*"} test test1/

     

     

    一般来说,操作的路径是绝对路径,那么规则里必须也写绝对路径,而且必须写完整的绝对路径。操作的路径是相对路径,那么规则里必须写相对路径,从哪里开始相对可能和工具有关。比如要操作路径"/abc/def",想要筛选def下的所有txt文件,必须写成"/abc/def/*.txt",如果操作路径是"abc/def",那么要筛选这个目录下的所有txt文件,可能需要写成"abc/def/*.txt",也有可能写成"*.txt",甚至写成"def/*.txt",写成哪种形式依赖于这个软件如何解析相对路径。

    对于rsync来说,要更复杂一些,因为除了bash的相对路径外,它自身还提供了一个相对路径的解析规则,而且尾随斜线也会影响规则的写法。这就是为什么写rsync规则非常麻烦的原因。

    我这里提供一个判断规则写法的方式,纯属我个人的经验总结:使用"-n"选项是dry run模式,也就是只测试不传输,"-i"选项是输出要传输文件的路径。"-i"只是一个便捷性选项,可以替换成其它选项来自定义输出格式,有时候通过这些信息来做一些判断是非常有用的,具体的可以翻man手册。

    root:~$ rsync -nr -i a b/
    cd+++++++++ a/
    >f+++++++++ a/1.txt
    >f+++++++++ a/2.txt
    >f+++++++++ a/3.txt
    >f+++++++++ a/4.txt

    这里已经显示了传输文件的路径"a/*",也就是说包括了目录a,且是相对路径的。所以要写规则时,需要加上这个a路径,比如下面的排除规则。

    root:~$ rsync -nr -i --exclude="a/2.txt"  a b/
    cd+++++++++ a/
    >f+++++++++ a/1.txt
    >f+++++++++ a/3.txt
    >f+++++++++ a/4.txt
    
    root:~$ rsync -nr -i --exclude="a/*.txt"  a b/
    cd+++++++++ a/

    如果上面的传输路径a加上尾随斜线,再看-i的输出路径信息,发现已经改变了:

    root:~$ rsync -nr -i a/ b/
    >f+++++++++ 1.txt
    >f+++++++++ 2.txt
    >f+++++++++ 3.txt
    >f+++++++++ 4.txt

    所以这时的排除规则中不应该包含a目录前缀:

    root:~$ rsync -nr -i --exclude="2.txt" ./a/ b/
    >f+++++++++ 1.txt
    >f+++++++++ 3.txt
    >f+++++++++ 4.txt

     "--delete"解释

    经过本人测试在--exclude="*.txt"再使用--delete会让目标文件里面所有的txt给予保留,所以再备份的时候,建议备份目录(不带/备份),这样可以在--exclude="abc/*.txt"可以指定需要过滤的文件,删除的时候也只会让这个文件不删除。

    所以,delete动作是比"--exclude"规则更晚执行的,被"--exclude"规则排除的文件不会进入文件列表中,在执行了delete时会认为该文件不存在于源端,从而导致目标端将这些文件删除。但这是想当然的,尽管理论上确实是这样的,但是rsync为了防止众多误删除情况,提供了两种规则:保护规则(protect)和取消保护规则(risk)。默认情况下,"--delete"和"--exclude"一起使用时,虽然发送端的exclude规则将文件标记为隐藏,使得接收端认为这些被排除文件在源端不存在,但rsync会将这些隐藏文件标记为保护文件,使得它们不受delete行为的影响,这样delete就删除不了这些被排除的文件。如果还是想要强行删除被exclude排除的文件,可以使用"--delete-excluded"选项强制取消保护,这样即使被排除的文件也会被删除。

    那么现在,是否理解了网上的言论"exclude排除的文件不会被删除"?

    除了"--delete",相关的选项还有"--delete-before"、"--delete-during"、"--delete-delay"等,它们都隐含了"--delete"选项,它们分别表示generator处理各个文件列表之前一次性全部删除待删除文件、处理文件列表时处理到哪个文件列表就删除该文件列表中的待删除文件,以及同步完所有数据后一次性删除所有待删除文件。

    举个例子,假如源端要传输3个目录a、b、c,在目标端a目录中有a1、a2、a3共3个文件需要被删除,b目录中有b1、b2、b3需要删除,同理c目录也一样c1、c2、c3需要被删除。

    如果是"--delete-before",则在目标端rsync刚启动时,就会把a1-a3、b1-b3、c1-c3一次性删除,然后才会处理文件列表中的a目录,处理完a后处理b,再是c。

    如果是"--delete-during",则在目标端rsync刚启动时,先处理文件列表中的a目录,处理a目录时发现此目录中有待删除文件a1-a3,顺手就删除它们,然后完成a目录的相关操作,再处理文件列表中的b目录,发现也有待删除文件b1-b3,顺手删除它们,同理c1-c3也如此。

    如果是"--delete-delay",则同步完文件列表中的a/b/c目录后,最后一次性删除a1-a3、b1-b3、c1-c3。

    其实"--delete"选项大多数情况下默认采用的就是"--delete-during"。

     

    rsync daemon模式暂时用不到,等有需要的时候再学习了。

     

     

    高手翻译的文档:https://www.cnblogs.com/f-ck-need-u/p/7221713.html

    参考网址:https://www.cnblogs.com/f-ck-need-u/p/7220009.html#blog21

    https://www.cnblogs.com/kevingrace/p/5766139.html(可借鉴)

  • 相关阅读:
    UDP
    TCP
    python基础之socket编程
    单列模式
    元类
    issubclass()和isinstance()
    手持机设备公司(WINCE/ANDROID/LINUX)
    Android Hal 分析
    Android JNI 使用的数据结构JNINativeMethod详解
    MTK GPIO 一些理解
  • 原文地址:https://www.cnblogs.com/sidianok/p/11767743.html
Copyright © 2011-2022 走看看