我正在尝试从各种文件夹递归更新一些* .png文件。 我的目标是在一个命令中完成它。
这适用于文件夹SQ002:
rsync -r -v --size-only --chmod=ugo=rwX --include='SQ001/***' --include='*.png' --exclude='*' /LocalFolder/ root@distantServer:/distantFolder/
复制SQ002子目录中的所有* .png文件。
但是当我想添加第二个文件夹时......
rsync -r -v --size-only --chmod=ugo=rwX --include='SQ001/***' --include='SQ002/***' --include='*.png' --exclude='*' /LocalFolder/ root@distantServer:/distantFolder/
无论文件扩展名是什么,都会复制所有文件。
如果有人可以帮助我!!
答案 0 :(得分:0)
您的两个命令都将包含所有文件(例如* .jpg也是如此)-请参阅此答案末尾的示例输出。
您可能想要的是这样的东西:
rsync -m -r -v --size-only --chmod=ugo=rwX --exclude='/SQ00[3-9]' --include='*/' --include='*.png' --exclude='*' /LocalFolder/ root@distantServer:/distantFolder/
注意事项是,您现在必须像以前一样排除所有不想更新的文件夹,而不是包括要更新的文件夹。
因此,--exclude='/SQ00[3-9]'
必须先于--include='*/'
(包括/LocalFolder/
的所有目录和子目录)之前,才能起作用。
我在-m, --prune-empty-dirs prune empty directory chains from file-list
上添加了'-m',这样可以避免空目录。
仅此而已,现在让我在下面向您展示各种变体的外观。
让我们通过以下方式设置舞台:
1.用./srcdir/
代替/LocalFolder/
,用./destdir/
代替root@distantServer:/distantFolder/
2.显示./srcdir/
内部的内容:
$ find srcdir -printf '%P\n' | sort
SQ001
SQ001/1
SQ001/1/5
SQ001/1/5/one4.png
SQ001/1/7
SQ001/1/7/one5.png
SQ001/1/emptydir1
SQ001/1/one3.png
SQ001/1/somefile2.jpg
SQ001/emptydir4
SQ001/one2.png
SQ001/one.png
SQ001/somefile.jpg
SQ001/SQ003
SQ001/SQ003/one.png
SQ001/SQ003/somefile.jpg
SQ002
SQ002/1
SQ002/1/5
SQ002/1/5/one4.png
SQ002/1/5/somefile4.jpg
SQ002/1/7
SQ002/1/7/one5.png
SQ002/1/emptydir2
SQ002/1/one3.png
SQ002/1/somefile3.jpg
SQ002/emptydir5
SQ002/somefile2.jpg
SQ002/two2.png
SQ002/two.png
SQ003
SQ003/1
SQ003/1/5
SQ003/1/5/one4.png
SQ003/1/5/somefile4.jpg
SQ003/1/7
SQ003/1/7/one5.png
SQ003/1/emptydir3
SQ003/1/one3.png
SQ003/1/somefile3.jpg
SQ003/emptydir6
SQ003/one2.png
SQ003/somefile2.jpg
SQ003/three.png
SQ006
SQ006/one2.png
SQ006/somefile2.jpg
SQ009
SQ009/one2.png
SQ009/somefile2.jpg
jpg文件用于代替任何其他非png文件,以查看我们的rsync命令是否接受了png以外的任何东西(这很糟糕-不是我们想要的)
现在让我们看看各种rsync命令会发生什么:
$ rm -rf destdir; rsync -m -r -v --size-only --chmod=ugo=rwX --exclude='/SQ00[3-9]' --include='*/' --include='*.png' --exclude='*' ./srcdir/ ./destdir/
building file list ... done
created directory ./destdir
./
SQ001/
SQ001/one.png
SQ001/one2.png
SQ001/1/
SQ001/1/one3.png
SQ001/1/5/
SQ001/1/5/one4.png
SQ001/1/7/
SQ001/1/7/one5.png
SQ001/SQ003/
SQ001/SQ003/one.png
SQ002/
SQ002/two.png
SQ002/two2.png
SQ002/1/
SQ002/1/one3.png
SQ002/1/5/
SQ002/1/5/one4.png
SQ002/1/7/
SQ002/1/7/one5.png
sent 1,075 bytes received 287 bytes 2,724.00 bytes/sec
total size is 22 speedup is 0.02
因此,排除了所有空目录(由于-m
),仅更新*.png
个文件(因此,根据需要忽略了诸如*.jpg
之类的其他文件),SQ001中的SQ003子目录(正确地)未被忽略,只有根SQ003被使用(根据--exclude='/SQ00[3-9]'
确保其模式/
); SQ006和SQ009也匹配排除模式。因此,这基本上是您的答案,需要警告的是,如果您只想更新SQ001和SQ002,则必须排除其他所有根文件夹(类似于SQ003,SQ006,SQ009)。
接下来,如果不使用-m
,该怎么办:
$ rm -rf destdir; rsync -r -v --size-only --chmod=ugo=rwX --exclude='/SQ00[3-9]' --include='*/' --include='*.png' --exclude='*' ./srcdir/ ./destdir/
sending incremental file list
created directory ./destdir
./
SQ001/
SQ001/one.png
SQ001/one2.png
SQ001/1/
SQ001/1/one3.png
SQ001/1/5/
SQ001/1/5/one4.png
SQ001/1/7/
SQ001/1/7/one5.png
SQ001/1/emptydir1/
SQ001/SQ003/
SQ001/SQ003/one.png
SQ001/emptydir4/
SQ002/
SQ002/two.png
SQ002/two2.png
SQ002/1/
SQ002/1/one3.png
SQ002/1/5/
SQ002/1/5/one4.png
SQ002/1/7/
SQ002/1/7/one5.png
SQ002/1/emptydir2/
SQ002/emptydir5/
sent 1,173 bytes received 316 bytes 992.67 bytes/sec
total size is 23 speedup is 0.02
如您所见,空目录在列表中,因此您可以将它们放在目的地(也许是需要的,所以取决于您)。
现在让我们看看如果将--include='*/'
移到--exclude='/SQ00[3-9]'
之前会发生什么:
$ rm -rf destdir; rsync -r -v --size-only --chmod=ugo=rwX --include='*/' --exclude='/SQ00[3-9]' --include='*.png' --exclude='*' ./srcdir/ ./destdir/
sending incremental file list
created directory ./destdir
./
SQ001/
SQ001/one.png
SQ001/one2.png
SQ001/1/
SQ001/1/one3.png
SQ001/1/5/
SQ001/1/5/one4.png
SQ001/1/7/
SQ001/1/7/one5.png
SQ001/1/emptydir1/
SQ001/SQ003/
SQ001/SQ003/one.png
SQ001/emptydir4/
SQ002/
SQ002/two.png
SQ002/two2.png
SQ002/1/
SQ002/1/one3.png
SQ002/1/5/
SQ002/1/5/one4.png
SQ002/1/7/
SQ002/1/7/one5.png
SQ002/1/emptydir2/
SQ002/emptydir5/
SQ003/
SQ003/one2.png
SQ003/three.png
SQ003/1/
SQ003/1/one3.png
SQ003/1/5/
SQ003/1/5/one4.png
SQ003/1/7/
SQ003/1/7/one5.png
SQ003/1/emptydir3/
SQ003/emptydir6/
SQ006/
SQ006/one2.png
SQ009/
SQ009/one2.png
sent 1,859 bytes received 481 bytes 4,680.00 bytes/sec
total size is 37 speedup is 0.02
所以好像它不存在。
这个答案有点长,所以我只包括一个变体,就是你的:
$ rm -rf destdir; rsync -r -v --size-only --chmod=ugo=rwX --include='SQ00[1-2]/***' --include='*.png' --exclude='*' ./srcdir/ ./destdir/
sending incremental file list
created directory ./destdir
./
SQ001/
SQ001/one.png
SQ001/one2.png
SQ001/somefile.jpg
SQ001/1/
SQ001/1/one3.png
SQ001/1/somefile2.jpg
SQ001/1/5/
SQ001/1/5/one4.png
SQ001/1/7/
SQ001/1/7/one5.png
SQ001/1/emptydir1/
SQ001/SQ003/
SQ001/SQ003/one.png
SQ001/SQ003/somefile.jpg
SQ001/emptydir4/
SQ002/
SQ002/somefile2.jpg
SQ002/two.png
SQ002/two2.png
SQ002/1/
SQ002/1/one3.png
SQ002/1/somefile3.jpg
SQ002/1/5/
SQ002/1/5/one4.png
SQ002/1/5/somefile4.jpg
SQ002/1/7/
SQ002/1/7/one5.png
SQ002/1/emptydir2/
SQ002/emptydir5/
sent 1,591 bytes received 430 bytes 4,042.00 bytes/sec
total size is 35 speedup is 0.02
如果将SQ00[1-2]
替换为SQ001
来获得第一个命令,则除了不包括SQ002 /以外,您将获得相同的结果,但是您甚至可以看到* .jpg。