- --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 排除的使用方法以及学会把排除元素写入文件,通过加载文件完成单项 或 多项排除任务。