如何使用rsync递归复制目录同时排除特定文件
https://onitroad.com 更多教程

解决方法

一般来说,我们使用'cp'命令来复制文件,但不幸的是,'cp'命令没有“排除”功能,所以我们需要编写一些脚本来排除不需要的文件,或者我们可以使用其他工具' rsync'。

从 rsync 命令的手册页:

$ man rsync
...
  -r, --recursive             recurse into directories
  --exclude=PATTERN           exclude files matching PATTERN

rsync 命令复制目录同时排除特定文件/目录的语法如下所示:

$ rsync -r --exclude 'file_path' 'SRC' 'DEST'

例如,如果我们不想将 oracle 文件夹的所有文件都复制到 oraclebak 中,除了 'oracle/oradata/rmanbackup':

$ du -sh oracle/*
40K oracle/extapi
1.1G oracle/oradata                    ------> sub directory of oracle
4.0K oracle/test1
4.0K oracle/test2
4.0K oracle/test3
4.0K oracle/test4
4.0K oracle/test5
# du -sh oracle/oradata/*
4.0K oracle/oradata/date1
4.0K oracle/oradata/date2
4.0K oracle/oradata/date3
4.0K oracle/oradata/date4
4.0K oracle/oradata/date5
1.1G oracle/oradata/rmanbackup  -------> we need to exclude this directory

排除路径是“SRC”下文件的相对路径,例如我们要排除“oracle/oradata/rmanbackup”,父目录是oracle,所以排除路径是“oradata/rmanbackup”:

# rsync -r --exclude 'oradata/rmanbackup' oracle/ oraclebak
# du -sh oraclebak/oracle/*
40K oraclebak/oracle/extapi
24K oraclebak/oracle/oradata
4.0K oraclebak/oracle/test1
4.0K oraclebak/oracle/test2
4.0K oraclebak/oracle/test3
4.0K oraclebak/oracle/test4
4.0K oraclebak/oracle/test5

如果我们要排除更多文件/目录,我们还可以使用选项“-exclude-from=FILE”。
在这种情况下,我们只需列出要在文件中排除的文件/目录,并提供选项“-exclude-from=”的文件路径

# man rsync
--exclude-from=FILE     read exclude patterns from FILE

例如:

# rsync -r --exclude-file=/tmp/exclude_list oracle/ oraclebak

其中:
/tmp/exclude_list 包含复制其他文件/目录时要排除的文件/目录列表。

问题

使用 rsync 时如何在排除特定文件夹/文件的同时递归复制文件夹?

日期:2020-09-17 00:10:54 来源:oir作者:oir