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