rsync 与通配符中的“文件来自”

rsync 与通配符中的“文件来自”

[我必须更改示例以明确存在子目录。]

假设我想重新创建层次结构的一个子集。为了论证起见,假设我想备份 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-fromfilelist.conf

+ /usr/lib/ld-* 
+ /usr/bin/gcc*
+ /etc/passwd
+ /etc/nonexisting
- *

您需要在文件中指定+或包含或排除。最后的规则对于使包含规则起作用是必要的,因为默认情况下包含所有内容-- *不要把它放在第一位,否则它会覆盖包含规则。

相关内容