She*_*ang 59 unix linux rsync darwin
我在使用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
Run Code Online (Sandbox Code Playgroud)
我想要做的是只对子目录中以"file_11_"开头的文件运行rsync,我希望能够只运行一个rsync作业来同步子目录中的所有这些文件.
这是我正在尝试的命令:
rsync -nrv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
这导致在我的干运行中标记0个文件以进行传输.我已经尝试了--include和--exclude语句的各种其他组合,但要么继续得不到结果,要么得到所有内容,好像没有设置包含或排除选项.
任何人都知道如何做到这一点?
rua*_*akh 105
问题是--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/
(相同的概念,但它将包含的目录更加挑剔).
Ami*_*ein 21
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...
Run Code Online (Sandbox Code Playgroud)
最后要注意的是,根本不要依赖于开头用于评估路径的星号; 喜欢"**dir"(可以将它们用于单个文件夹或文件而不是路径)并注意两个以上的星号不适用于文件名.
这是我“教人钓鱼”的答案:
Rsync 的语法绝对不直观,但值得理解。
-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 *
Run Code Online (Sandbox Code Playgroud)
这里的关键概念是 rsync 递归地为每个目录应用包含/排除模式。一旦第一个包含/排除匹配,处理就会停止。
它评估的第一个目录是/Storage/uploads. Storage/uploads有1280000000/, 1260000000/, 1270000000/目录/文件。它们都不匹配file_11*.jpg以包含在内。所有这些都匹配*以排除。所以它们被排除在外,rsync 结束。
*/)。那么第一个 dir 组件将是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
Run Code Online (Sandbox Code Playgroud)
https://download.samba.org/pub/rsync/rsync.1