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

ivo*_*lch 11 rsync

[我不得不更改示例以明确说明有子目录。]

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

  • '*' 匹配任何路径组件,但它在斜线处停止。
  • 使用 '**' 匹配任何内容,包括斜线。


Gra*_*eme 7

如果要使用通配符,可以使用--include-from代替--files-fromfilelist.conf应该是这样的:

+ /usr/lib/ld-* 
+ /usr/bin/gcc*
+ /etc/passwd
+ /etc/nonexisting
- *
Run Code Online (Sandbox Code Playgroud)

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