[我必须更改示例以明确存在子目录。]
假设我想重新创建层次结构的一个子集。为了论证起见,假设我想备份 filelist.conf 中的文件
# cat rsync-list
ab*
bb*
和
# find .
.
./abc
./abc/file-in-abc
./abd
./abd/file-in-abd
./aca
./bba
./bbc
./bca
./rsync-list
我本来希望
rsync -arv --include-from=rsync-list --exclude='*' . /somewhere-else
将重新创建 abc、abd、bba 和 bbc。问题是它不会下降到 ab* 目录,因此它不会执行 abc/file-in-abc 和 abd/file-in-abd。因此,从这个意义上说,ab*实际上并不是一个扩展为abc和abd然后rsync的通配符。
答案1
这联机帮助页列出了这五个选项:
--exclude=PATTERN exclude files matching PATTERN
--exclude-from=FILE read exclude patterns from FILE
--include=PATTERN don't exclude files matching PATTERN
--include-from=FILE read include patterns from FILE
--files-from=FILE read list of source-file names from FILE
--files-from
用于精确的文件名,--include-from
用于模式,所以您可能想尝试一下。
使用include-from
,你不需要指定+
,但您确实需要排除其他所有内容。例如,给定:
$ ls -v1 source
image1.tiff
...
image700.tiff
$ cat includes
image7*.tiff
然后我只能image7*.tiff
使用以下方式同步:
rsync -aP --include-from=includes --exclude='*' source/ target
手册页还在该INCLUDE/EXCLUDE PATTERN RULES
部分中提到:
- '*' 匹配任何路径组件,但它在斜杠处停止。
- 使用“**”来匹配任何内容,包括斜杠。
答案2
如果您想使用通配符,可以使用--include-from
代替。应该看起来像这样:--files-from
filelist.conf
+ /usr/lib/ld-*
+ /usr/bin/gcc*
+ /etc/passwd
+ /etc/nonexisting
- *
您需要在文件中指定+
或包含或排除。最后的规则对于使包含规则起作用是必要的,因为默认情况下包含所有内容-
。- *
不要把它放在第一位,否则它会覆盖包含规则。