使用Rsync include和exclude选项按模式包含目录和文件

问题描述 投票:52回答:3

我在使用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个文件以进行传输。我已经尝试了--include和--exclude语句的各种其他组合,但要么继续没有得到结果,要么得到所有内容,好像没有设置包含或排除选项。

任何人都知道如何做到这一点?

linux unix rsync darwin
3个回答
95
投票

问题是--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/

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


16
投票

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"(可以将它们用于单个文件夹或文件而不是路径)并注意两个以上的星号不适用于文件名。


8
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.