美文网首页LinuxLinux
4-10.9 Linux 中的文件同步传输 --- rsync

4-10.9 Linux 中的文件同步传输 --- rsync

作者: 捌千里路雲和月 | 来源:发表于2021-08-23 23:17 被阅读0次
    • --exclude 有时候使用 rsync 进行数据传输时,希望排除一些不需要传输的数据。这时,可以用 --exclude 参数排除指定数据,被排除的数据不会进行传输。
    • 4-10.9 内容:
      通过 rsync -a --exclude 学习传输数据时排除指定的数据。
    • 操作步骤:
      1、创建一些目录及文件用作测试。
    • 创建 backups_exclude 作为备份目录
    [root@localhost ~]# cd test/
    [root@localhost test]# ls
    SRC
    [root@localhost test]# mkdir backups_exclude    ## 新建 backups_exclude 备份目录
    [root@localhost test]# 
    [root@localhost test]# tree    ## 目录结构
    .
    ├── backups_exclude
    └── SRC
        ├── directory
        │   └── file2.txt
        └── file1.txt
    
    3 directories, 2 files
    
    
    • 创建多几个源文件。SRC目录下创建 file3.txt 和 file4.txt。SRC目录下创建 office_directory 目录。office_directory 目录分别创建 docxfile.docx、elsxfile.elsx 和 pptxfile.pptx 三个文件。
    [root@localhost test]# 
    [root@localhost test]# touch SRC/file3.txt    ## touch 创建文件
    [root@localhost test]# touch SRC/file4.txt
    [root@localhost test]# 
    [root@localhost test]# mkdir SRC/office_directory     ## mkdir 创建目录
    [root@localhost test]# 
    [root@localhost test]# touch SRC/office_directory/docxfile.docx
    [root@localhost test]# touch SRC/office_directory/elsxfile.elsx
    [root@localhost test]# touch SRC/office_directory/pptxfile.pptx
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    4 directories, 7 files
    [root@localhost test]# 
    
    

    2、测试传输文件时排除指定目录 (office_directory)。

    ## rsync传输 SRC目录数据的时候排除其 office_directory目录内容
    ## --exclude='office_directory' 排除指定的内容
    
    [root@localhost test]# rsync -av --exclude='office_directory' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表可以看到没有 --office_directory 目录
    ./
    file1.txt
    file3.txt
    file4.txt
    directory/      ## 传输列表中只有 driectory目录
    directory/file2.txt
    
    sent 355 bytes  received 103 bytes  916.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree    ## 目录结构
    .
    ├── backups_exclude    ## backups_exclude目录只有 directory 目录的数据,
                           ## office_directory没有传输过来
    │   ├── directory
    │   │   └── file2.txt
    │   ├── file1.txt
    │   ├── file3.txt
    │   └── file4.txt
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    5 directories, 11 files
    [root@localhost test]# 
    
    • rsync -av --exclude='office_directory' SRC backups_exclude/
      当源目录不加 / 的时候,会把源目录整个目录递归式的传输目标目录下。如 SRC 不加 / ,SRC会整个目录递归式的传输到 backups_exclude 目录,office_directory 目录除外。
    ## 源目录 SRC 没有加 / 符号
    [root@localhost test]# rsync -av --exclude='office_directory' SRC backups_exclude/
    sending incremental file list
    SRC/    ## 源目录 SRC 递归式传输内容。office_directory 目录除外。
    SRC/file1.txt
    SRC/file3.txt
    SRC/file4.txt
    SRC/directory/
    SRC/directory/file2.txt
    
    sent 366 bytes  received 104 bytes  940.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree    ## 目录结构
    .
    ├── backups_exclude
    │   └── SRC    ## SRC 目录递归过来 backups_exclude 目录
    │       ├── directory
    │       │   └── file2.txt
    │       ├── file1.txt
    │       ├── file3.txt
    │       └── file4.txt
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 11 files
    [root@localhost test]# 
    
    

    3、测试传输文件时排除指定类型的文件 (.txt 结尾)。

    ## rsync传输 SRC目录数据的时候排除 txt 结尾的文件
    ## --exclude='*.txt' 排除所有 txt 结尾的文件
    [root@localhost test]# rsync -av --exclude='*.txt' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表可以看出没有 txt 结尾的文件
    ./
    directory/
    office_directory/
    office_directory/docxfile.docx
    office_directory/elsxfile.elsx
    office_directory/pptxfile.pptx
    
    sent 329 bytes  received 88 bytes  834.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree    ## 目录结构
    .
    ├── backups_exclude    ## backups_exclude 没有 txt结尾的文件
    │   ├── directory
    │   └── office_directory
    │       ├── docxfile.docx
    │       ├── elsxfile.elsx
    │       └── pptxfile.pptx
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 10 files
    [root@localhost test]# 
    
    

    4、 源目录不加 / 的时候,会把源目录整个目录递归式的传输目标目录下。所有 txt 后缀除外。

    ## SRC不加 / ,连同目录递归一同传输到 backups_exclude,所有 txt 后缀除外。
    
    [root@localhost test]# rsync -av --exclude='*.txt' SRC backups_exclude/
    sending incremental file list
    SRC/
    SRC/directory/
    SRC/office_directory/
    SRC/office_directory/docxfile.docx
    SRC/office_directory/elsxfile.elsx
    SRC/office_directory/pptxfile.pptx
    
    sent 342 bytes  received 89 bytes  862.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude
    │   └── SRC    ## SRC 目录递归过来 backups_exclude 目录
    │       ├── directory
    │       └── office_directory
    │           ├── docxfile.docx
    │           ├── elsxfile.elsx
    │           └── pptxfile.pptx
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    7 directories, 10 files
    [root@localhost test]# 
    
    

    5、 rsync 传输时指定排除某一文件(file2.txt)

    ## --exclude='file2.txt'  传输时排除名为 file2.txt 的文件
    [root@localhost test]# rsync -av --exclude='file2.txt' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表可以看出没有传输 file2.txt
    ./
    file1.txt
    file3.txt
    file4.txt
    directory/
    office_directory/
    office_directory/docxfile.docx
    office_directory/elsxfile.elsx
    office_directory/pptxfile.pptx
    
    sent 531 bytes  received 145 bytes  1,352.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 没有 file2.txt文件
    │   ├── directory
    │   ├── file1.txt
    │   ├── file3.txt
    │   ├── file4.txt
    │   └── office_directory
    │       ├── docxfile.docx
    │       ├── elsxfile.elsx
    │       └── pptxfile.pptx
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 13 files
    [root@localhost test]# 
    
    

    6、 rsync 传输时指定排除某些字符串开头的文件(file 字符串开头的文件)

    ## -av --exclude='file*' 传输时排除 file 字符串开头的文件
    
    [root@localhost test]# rsync -av --exclude='file*' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表看出,没有传输 file 开头的文件
    ./
    directory/
    office_directory/
    office_directory/docxfile.docx
    office_directory/elsxfile.elsx
    office_directory/pptxfile.pptx
    
    sent 329 bytes  received 88 bytes  834.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 目录没有 file开头的文件
    │   ├── directory
    │   └── office_directory
    │       ├── docxfile.docx
    │       ├── elsxfile.elsx
    │       └── pptxfile.pptx
    └── SRC
        ├── directory    ## directory 目录下的文件是 file开头,所以排除传输
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 10 files
    [root@localhost test]# 
    
    

    7、 rsync 传输时排除含某些字符串的文件(含 c 字符的文件)

    ## -av --exclude='*c*' 传输时排除含 c 字符的目录和文件
    
    [root@localhost test]# rsync -av --exclude='*c*' SRC/ backups_exclude/
    sending incremental file list     ## 从传输列表看出,没有传输含 c 字符的目录和文件
    ./
    file1.txt
    file3.txt
    file4.txt
    
    sent 234 bytes  received 76 bytes  620.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 目录没有含 c 字符的目录和文件
    │   ├── file1.txt
    │   ├── file3.txt
    │   └── file4.txt
    └── SRC
        ├── directory    ## directory 目录含有 c 字符,整个目录及内容排除传输
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory    ## office_directory 目录含有 c 字符,
                                ## 所以整个目录及内容排除传输
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    4 directories, 10 files
    [root@localhost test]# 
    
    

    8、rsync 传输时排除某些字符串结尾的文件(x 字符结尾的文件)

    ##  -av --exclude='*x' 传输时排除 x 字符结尾的文件
    [root@localhost test]# rsync -av --exclude='*x' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表看出,没有传输 x 字符结尾的文件
    ./
    file1.txt
    file3.txt
    file4.txt
    directory/
    directory/file2.txt
    office_directory/
    
    sent 405 bytes  received 107 bytes  1,024.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 目录没有 x 字符结尾的目录和文件 
    │   ├── directory
    │   │   └── file2.txt
    │   ├── file1.txt
    │   ├── file3.txt
    │   ├── file4.txt
    │   └── office_directory
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory    ## office_directory目录的文件都是 x 字符结尾,
                                ## 所以排除传输
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 11 files
    [root@localhost test]# 
    
    

    9、多个排除条件可以用 { } 大扩号把条件括起来,条件与条件之间用 ,逗号分隔开。只用一个 --exclude参数。

    例一:--exclude={'directory','docxfile.docx','elsxfile.elsx'}
    条件 1:排除 directory 目录,因为 directory 没有 / 符号,所以是一个目录。
    条件 2:排除名为 docxfile.docx 文件。
    条件 3:排除名为 elsxfile.elsx 文件。

    [root@localhost test]# rsync -av --exclude={'directory','docxfile.docx','elsxfile.elsx'} SRC/ backups_exclude/ 
    sending incremental file list    ## 从传输列表可以看出排除了 directory 目录、docxfile.docx 和 elsxfile.elsx 文件
    ./
    file1.txt
    file3.txt
    file4.txt
    office_directory/
    office_directory/pptxfile.pptx
    
    sent 356 bytes  received 103 bytes  918.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 没有排除条件的内容
    │   ├── file1.txt
    │   ├── file3.txt
    │   ├── file4.txt
    │   └── office_directory
    │       └── pptxfile.pptx
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    5 directories, 11 files
    [root@localhost test]# 
    
    
    • 多条件排除,例二:--exclude={'e* ',' * 1 * ',' * 3 * ',' *tx'}
      条件 1:排除 e 开头的文件。
      条件 2:排除中间含有 1 的文件。
      条件 3:排除中间含有 3 的文件。
      条件 4:排除 tx 结尾的文件。
    [root@localhost test]# rsync -av --exclude={'e*','*1*','*3*','*tx'} SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表看出 e 开头、中间含有 1 和 3、tx 结尾的文件都没有传输
    ./
    file4.txt
    directory/
    directory/file2.txt
    office_directory/
    office_directory/docxfile.docx
    
    sent 353 bytes  received 88 bytes  882.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 目录没有 e 开头、中间含有 1 和 3、tx 结尾的文件
    │   ├── directory
    │   │   └── file2.txt
    │   ├── file4.txt
    │   └── office_directory
    │       └── docxfile.docx
    └── SRC    ## 源目录
        ├── directory
        │   └── file2.txt
        ├── file1.txt    ## 中间含有 1 的文件不会传输
        ├── file3.txt    ## 中间含有 3 的文件不会传输
        ├── file4.txt    
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx    ## e 开头的文件不会传输
            └── pptxfile.pptx    ## tx 结尾的文件不会传输
    
    6 directories, 10 files
    [root@localhost test]# 
    
    

    10、--exclude-from 通过加载文件的形式读取文件记录的参数,从而实现排除指定元素的功能。

    ## 首先,新建一个文档 --exclude-from
    [root@localhost test]# touch exclude-file.txt
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude
    ├── exclude-file.txt    ## 新建的 exclude-file.txt 文件
    └── SRC
        ├── directory
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    4 directories, 8 files
    [root@localhost test]# vim exclude-file.txt    ## vim 编辑 exclude-file.txt 文件
    
    -------------- 输入的文本内容 -------------
    *.txt    ## 输入所有 .txt结尾文件
    ~                                                                                                             
    ~  
    ~                                                                                                                                                                                                                 
    :wq!    
    ------ 输入完内容按 Esc 键退出编辑状态,输入 :wq! 强制保存退出 -------
    
    ## --exclude-from='exclude-file.txt' 加载 exclude-file.txt,
    ## 读取其内容,它的内容是 *.txt。意思是所有 .txt 结尾的文件,
    ## 效果等同于 --exclude='*.txt'
    
    [root@localhost test]# rsync -av --exclude-from='exclude-file.txt' SRC/ backups_exclude/
    sending incremental file list    ## 从传输列表中看出没有 .txt 结尾的文件
    ./
    directory/
    office_directory/
    office_directory/docxfile.docx
    office_directory/elsxfile.elsx
    office_directory/pptxfile.pptx
    
    sent 329 bytes  received 88 bytes  834.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 没有 .txt 结尾的文件
    │   ├── directory
    │   └── office_directory
    │       ├── docxfile.docx
    │       ├── elsxfile.elsx
    │       └── pptxfile.pptx
    ├── exclude-file.txt
    └── SRC
        ├── directory    ## 源文件 directory 下的都是 .txt 文件,符合排除条件
        │   └── file2.txt
        ├── file1.txt
        ├── file3.txt
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx
            └── pptxfile.pptx
    
    6 directories, 11 files
    [root@localhost test]# 
                                               
    
    • 加载文件多项排除元素的方法,原理和在文件添加单项元素一样。只是,每个元素为一行。
    ## 同样的首先要编辑 exclude-file.txt 文档,每个排除的元素为一行。
    [root@localhost test]# vim exclude-file.txt 
    
    e*    ## e开头的文件
    *1*    ## 文件名含 1 的字符
    *3*    ## 文件名含 3 的字符
    *tx    ## tx结尾的文件
    ~                                                                                                             
    ~                                                                                                             
    ~                                                                                                                                                                                                                  
    :wq!         
    
    ## --exclude-from='exclude-file.txt' 加载 exclude-file.txt,
    ## 读取其内容,它的内容是 e*、*1*、*3*、*tx。
    ## 意思是所有 e 开头的文件、文件名含 1 的字符、文件名含 3 的字符 和 tx结尾的文件,
    ## 效果等同于--exclude={'e*','*1*','*3*','*tx'}
    
    [root@localhost test]# rsync -av --exclude-from='exclude-file.txt' SRC/ backups_exclude/
    sending incremental file list   ## 从传输列表看出 e 开头、中间含有 1 和 3、tx 结尾的文件都没有传输  
    ./
    file4.txt
    directory/
    directory/file2.txt
    office_directory/
    office_directory/docxfile.docx
    
    sent 353 bytes  received 88 bytes  882.00 bytes/sec
    total size is 0  speedup is 0.00
    [root@localhost test]# 
    [root@localhost test]# tree
    .
    ├── backups_exclude    ## backups_exclude 目录没有 e 开头、中间含有 1 和 3、tx 结尾的文件
    │   ├── directory
    │   │   └── file2.txt
    │   ├── file4.txt
    │   └── office_directory
    │       └── docxfile.docx
    ├── exclude-file.txt
    └── SRC    ## 源目录
        ├── directory
        │   └── file2.txt
        ├── file1.txt    ## 中间含有 1 的文件不会传输
        ├── file3.txt    ## 中间含有 3 的文件不会传输
        ├── file4.txt
        └── office_directory
            ├── docxfile.docx
            ├── elsxfile.elsx    ## e 开头的文件不会传输
            └── pptxfile.pptx    ## tx 结尾的文件不会传输
    
    6 directories, 11 files
    [root@localhost test]# 
                                       
    
    • 由上述测试可以得出 --exclude 排除的使用方法以及学会把排除元素写入文件,通过加载文件完成单项 或 多项排除任务。

    相关文章

      网友评论

        本文标题:4-10.9 Linux 中的文件同步传输 --- rsync

        本文链接:https://www.haomeiwen.com/subject/ypxzbltx.html