我在正确理解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选项一样。
有人知道怎么做吗?
3条答案
按热度按时间bxgwgixi1#
问题是
--exclude="*"
说要排除(例如)1260000000/
目录,所以rsync
永远不会检查该目录的内容,所以永远不会注意到该目录包含--include
匹配的文件。我想最接近你想要的是这个:
(这将包括所有目录,以及所有匹配
file_11*.jpg
的文件,但没有其他文件),或者 * 也许 * 如下:(same概念,但更挑剔的目录,它将包括)。
在这两种情况下,请注意
--include=...
选项需要在--exclude=...
选项之前,因为当文件同时匹配这两种模式时,我们需要前者优先于后者。8wtpewkr2#
rsync
包含排除模式示例:最后要注意的是,不要简单地依赖于在开始时用于评估路径的星号;像
"**dir"
(它的确定使用他们为单个文件夹或文件,但不是路径),并注意,超过两个星号不工作的文件名。wmvff8tz3#
以下是我“授人以渔”的回答:
Rsync的语法肯定不直观,但值得理解。
1.首先,使用
-vvv
查看rsync的调试信息。这里的关键概念是rsync递归地为每个目录应用include/exclude模式。只要第一个include/exclude匹配,处理就会停止。
它评估的第一个目录是
/Storage/uploads
。Storage/uploads
有1280000000/, 1260000000/, 1270000000/
目录/文件。它们都不匹配file_11*.jpg
以包含。它们都匹配*
以排除。因此它们被排除,rsync结束。1.解决方案是首先包含所有目录(
*/
)。然后第一个目录组件将是1260000000/, 1270000000/, 1280000000/
,因为它们匹配*/
。下一个目录组件将是1260000000/
。在1260000000/
中,file_11_00.jpg
匹配--include="file_11*.jpg"
,因此它被包含。依此类推。https://download.samba.org/pub/rsync/rsync.1