4-10.9 Linux 中的文件同步传输 --- rsync --exclude 排除不需要传输的数据

  • --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 --exclude 排除不需要传输的数据)