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

inb24sb2  于 2023-04-20  发布在  Linux
关注(0)|答案(3)|浏览(161)

我在正确理解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语句的各种其他组合,但要么继续没有结果,要么得到了所有东西,就好像没有设置include或exclude选项一样。
有人知道怎么做吗?

bxgwgixi

bxgwgixi1#

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

(same概念,但更挑剔的目录,它将包括)。
在这两种情况下,请注意--include=...选项需要在--exclude=...选项之前,因为当文件同时匹配这两种模式时,我们需要前者优先于后者。

8wtpewkr

8wtpewkr2#

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"(它的确定使用他们为单个文件夹或文件,但不是路径),并注意,超过两个星号不工作的文件名。

wmvff8tz

wmvff8tz3#

以下是我“授人以渔”的回答:
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递归地为每个目录应用include/exclude模式。只要第一个include/exclude匹配,处理就会停止。
它评估的第一个目录是/Storage/uploadsStorage/uploads1280000000/, 1260000000/, 1270000000/目录/文件。它们都不匹配file_11*.jpg以包含。它们都匹配*以排除。因此它们被排除,rsync结束。
1.解决方案是首先包含所有目录(*/)。然后第一个目录组件将是1260000000/, 1270000000/, 1280000000/,因为它们匹配*/。下一个目录组件将是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

相关问题