使用Rsync的包含和排除选项按模式包括目录和文件


70

我在rsync正确设置语法方面遇到问题,并且想知道我的方案是否可以真正使用处理rsync。首先,我已经确认rsync本地主机和远程主机之间的运行正常。在目录上进行直接同步成功。

我的文件系统如下所示:

uploads/
  1260000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1270000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg
  1280000000/
    file_11_00.jpg
    file_11_01.jpg
    file_12_00.jpg

我想做的是仅在子目录中以“ file_11_”开头的文件上运行rsync,并且我希望能够仅运行一个rsync作业来同步子目录中的所有这些文件。

这是我正在尝试的命令:

rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

这导致0文件在我的空运行中被标记为可以传输。我尝试了--includeand--exclude语句的各种其他组合,但是要么继续未获得任何结果,要么获得了所有内容,就好像没有设置任何include或exclude选项一样。

有人知道如何执行此操作吗?

Answers:


126

问题是--exclude="*"说要排除(例如)1260000000/目录,所以rsync永远不要检查该目录的内容,所以永远不会注意到该目录包含您的--include

我认为最接近您想要的是:

rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(将包括所有目录,以及所有与匹配的文件file_11*.jpg,但不包括其他文件),或者也许是这样的:

rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

(相同的概念,但将包含的目录更加挑剔)。


1
谢谢!那正是我所需要的。我的情况实际上与您在第二个示例中描述的差不多,但是我简化了我的问题,以使问题更直接。
谢尔顿·张

11
请注意(例如)--include="*/"包括您实际要包括的文件的目录的重要性。
mabraham

23
请注意参数的顺序:--include必须在--exclude
hfs

@hfs是的,我觉得应该在实际答案中提及。在找到此页面之前,我曾尝试做类似的事情,并且知道我需要-include="*/",但仍然无法正常工作。看着这个答案,我的第一个念头是“那正是我在做什么!”。然后我注意到顺序是不同的。
劳伦斯·贡萨尔维斯

另一个关键概念是“当使用--recursive(-r)选项(由-a表示)时,将从上向下访问每个路径的每个子组件,因此将包含/排除模式递归应用于每个子组件的全部名称”
wisbucky

38

rsync 包括排除模式示例:

"*"         means everything
"dir1"      transfers empty directory [dir1]
"dir*"      transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*"     transfers files whose names start with [file]
"dir**"     transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***"    same as above
"dir1/*"    does nothing
"dir1/**"   does nothing
"dir1/***"  transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...

最后一点是,不要仅仅依靠开始时使用的星号来评估路径。例如"**dir"(可以将它们用于单个文件夹或文件,但不能用于路径),并且请注意,文件名不能使用两个以上的星号。


5
您的答案是唯一可用的答案,因为您可以解释一般行为。根据OP,其他答案过于具体,但每种情况都需要另一种解决方案!这对我帮助很大!
彼得·瓦尔加

@AlBundy我很高兴!
AmirHossein

2
可以在手册rsync页的“ INCLUDE/EXCLUDE PATTERN RULES
Griddo”

13

将-m添加到上面的建议答案中,以修剪空目录。


0

这是我的“教人钓鱼”的答案:

Rsync的语法绝对是非直觉的,但值得理解。

  1. 首先,用于-vvv查看rsync的调试信息。
$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *

这里的关键概念是rsync递归地为每个目录应用包含/排除模式。一旦第一个包含/排除被匹配,处理就停止。

它评估的第一个目录是/Storage/uploadsStorage/uploads1280000000/, 1260000000/, 1270000000/目录/文件。它们都不匹配file_11*.jpg包含。它们全部匹配*以排除。因此它们被排除在外,并且rsync结束。

  1. 解决方案是首先包含所有dirs(*/)。然后第一个dir组件将是1260000000/, 1270000000/, 1280000000/因为它们匹配*/。下一个dir组件将是1260000000/。在中1260000000/file_11_00.jpg匹配--include="file_11*.jpg",因此包含在内。依此类推。
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/

./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg

https://download.samba.org/pub/rsync/rsync.1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.