使用通配符和使用扩展名过滤文件来同步多个文件夹源

时间:2014-02-11 14:31:06

标签: file filtering rsync directory

我正在尝试从各种文件夹递归更新一些* .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/

无论文件扩展名是什么,都会复制所有文件。

如果有人可以帮助我!!

1 个答案:

答案 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。