Rsync:如何仅同步某些目录中的某些文件类型?

Rsync:如何仅同步某些目录中的某些文件类型?

我想将所有图像类型文件从几个目录复制到 /images。我想将所有视频类型文件从同一目录复制到 /videos。我想排除所有点目录和点文件(隐藏文件和目录)。

目录结构:

DCIM (GOOD)
DCIM/.thumbnails (BAD)
DCIM/AccessoryCamera (GOOD)
.cloudagent (BAD)
Pictures (GOOD)
Downloads (GOOD)

我在尝试:

rsync -ravtz --progress --prune-empty-dirs --include "DCIM/" --include "Download/*" --include "Picture/" --include "*.jpg" --include "*.png" --include "*.gif" --include "*.nef" --exclude '"*"' --exclude '".*"' --exclude '"*/"' --exclude '".*/"' --exclude '"DCIM/.thumbnails/*' --log-file=/mm/rsync.log /mnt/S8/sdcard/ '/mm/images'

rsync -ravtz --progress --prune-empty-dirs --include "DCIM/" --include "Download/*" --include "Picture/" --include "*.mov" --include "*.mpeg" --include "*.mpg" --include "*.mp4" --exclude '"*"' --exclude '".*"' --exclude '"*/"' --exclude '".*/"' --exclude '"DCIM/.thumbnails/*' --log-file=/mm/rsync.log /mnt/S8/sdcard/ '/mm/videos'

答案1

Rsync 过滤器:仅复制一种模式有关如何构建 rsync 过滤器的更多说明。总体思路是包含您需要的内容(包括导致您需要的内容的任何目录)并在最后排除其余内容。

rsync -az --progress --prune-empty-dirs \
    --exclude '.*' \
    --include "/DCIM" --include "/Download" --include "/Picture" --exclude '/*' \
    --include "*.jpg" --include "*.png" --include "*.gif" --include "*.nef" \
    --include '*/' --exclude '*' \
    --log-file=/mm/rsync.log /mnt/S8/sdcard/ '/mm/images'
  1. 排除所有点文件。
  2. 包括一些目录并排除顶层的所有其他内容。
  3. 包括您想要的文件类型。
  4. 包括所有目录(除了已在顶层排除的目录)并排除其他所有目录。

答案2

(1)创建一个文本文件,其中包含要从设备同步的目录:

./input_dirs

内容./input_dirs

./DCIM ./Pictures ./DCIM/AccessoryCamera ./Downloads

使用 --files-from=./input_dirs.txt参数将有问题的目录加载到 RSYNC 中

(2)利用--filter='dir-merge ./filter_file'参数加载您想要的扩展过滤器。 (例如:*.png *.gif *.jpg)

内容./filter_file

+ *.png + *.jpg + *.gif - /*

(3)我刚刚在 Linux 沙盒服务器上运行了这个测试,它成功了。请注意,仅有的应该复制的文件是.png,.gif,*.jpg

结果:

[root@localhost ~]# ls -Fal total 1012 dr-xr-x---. 4 root root 4096 Jun 5 20:03 ./ dr-xr-xr-x. 26 root root 4096 May 30 15:16 ../ -rw-------. 1 root root 1219 May 30 15:04 anaconda-ks.cfg -rw-------. 1 root root 7161 Jun 5 19:45 .bash_history -rw-r--r--. 1 root root 18 Apr 29 2010 .bash_logout -rw-r--r--. 1 root root 176 Apr 29 2010 .bash_profile -rw-r--r--. 1 root root 176 Apr 29 2010 .bashrc -rw-r--r--. 1 root root 100 Apr 29 2010 .cshrc -rwxr--r--. 1 root root 9565 May 30 20:41 cve.sh* drwxr-xr-x. 2 root root 4096 Jun 5 20:03 dest/ -rw-r--r--. 1 root root 14704 Dec 27 12:40 epel-release-7-9.noarch.rpm -rw-r--r--. 1 root root 508 May 30 22:08 file1 -rw-r--r--. 1 root root 508 May 30 22:08 file2 -rw-r--r--. 1 root root 29 Jun 5 20:03 filter_file -rw-r--r--. 1 root root 3 Jun 5 19:46 input_dirs -rw-r--r--. 1 root root 28978 May 30 15:04 install.log -rw-r--r--. 1 root root 7572 May 30 15:01 install.log.syslog -rw-------. 1 root root 88 Jun 4 17:49 .lesshst drwxr-----. 3 root root 4096 Jun 4 17:45 .pki/ -rw-r--r--. 1 root root 624068 May 24 04:34 samba-4.4.4-14.el7_3.x86_64.rpm -rw-r--r--. 1 root root 266168 May 24 04:34 samba-libs-4.4.4-14.el7_3.x86_64.rpm -rw-r--r--. 1 root root 129 Apr 29 2010 .tcshrc -rw-r--r--. 1 root root 0 Jun 5 19:55 test.gif -rw-r--r--. 1 root root 0 Jun 5 19:55 test.jpg -rw-r--r--. 1 root root 0 Jun 5 19:54 test.png

[root@localhost ~]# rsync -av --dry-run --files-from=./input_dirs --filter='dir-merge ./filter_file' ./ ./dest building file list ... done ./ test.gif test.jpg test.png sent 92 bytes received 24 bytes 232.00 bytes/sec total size is 0 speedup is 0.00 (DRY RUN)

删除 --dry-run 以实际复制文件。

相关内容