Arch Linux下使用rsync复制文件时的排除与包含规则配置问题
Arch Linux下使用rsync复制文件时的排除与包含规则配置问题
看起来你在rsync的包含/排除规则上有点绕晕了,我来帮你理清楚两种场景的解决方案——先解决你最初「只复制主目录图片、跳过所有子文件夹」的需求,再说说你后来问的「包含所有子文件夹里的图片」该怎么配置。
一、只复制源文件夹根目录的.jpg/.png,忽略所有子文件夹
你的第一个脚本之所以失败,是因为加了--include="*/",这个规则会让rsync遍历所有子目录,完全违背了你想跳过子文件夹的初衷。要实现只取根目录的图片,我们不需要遍历子目录,直接指定匹配根目录的文件即可:
#!/bin/bash source_folder="/home/Minja/Desktop/Test2/" destination_folder="/home/Minja/Desktop/Destination/" # 只复制源文件夹根目录下的jpg和png,完全跳过所有子文件夹 rsync -av --include="*.jpg" --include="*.png" --exclude="*/*" --exclude="*" "$source_folder" "$destination_folder"
关键参数解释:
--include="*.jpg"和--include="*.png":先声明要保留的文件类型--exclude="*/*":排除所有子目录下的内容(*/*能匹配任何子目录里的文件或文件夹)--exclude="*":最后排除所有未被前面规则包含的内容(rsync的规则是按顺序匹配的,所以这条要放在最后)
这样rsync只会处理源文件夹根目录的文件,碰到子文件夹直接跳过,完美贴合你最初的需求。
二、复制所有层级(包括子文件夹)的.jpg/.png,保留目录结构
如果你后来的需求是要把所有子文件夹里的图片也一起复制,那我们需要调整规则,让rsync遍历所有目录,但只保留图片文件:
#!/bin/bash source_folder="/home/Minja/Desktop/Test2/" destination_folder="/home/Minja/Desktop/Destination/" # 复制所有层级的jpg和png,保留原目录结构 rsync -av --include="*/" --include="*.jpg" --include="*.png" --exclude="*" "$source_folder" "$destination_folder"
规则顺序的逻辑:
--include="*/":先包含所有目录,这样rsync才能深入子文件夹查找图片--include="*.jpg"和--include="*.png":接着声明要保留的图片文件--exclude="*":最后排除所有未被前面规则包含的内容(比如子文件夹里的非图片文件、其他类型文件)
这个命令会把Test2下所有层级的.jpg/.png都复制到Destination,并且保留原来的目录结构,比如Test2/abcd/xxx.png会被复制到Destination/abcd/xxx.png。
为什么你原来的脚本会失败?
你原来的第一个命令里,--include="*/"让rsync遍历了所有子目录,后续的图片包含规则会匹配所有层级的图片,最后--exclude="*"排除其他,但这样就会把所有图片(包括子文件夹的)都复制,同时还会保留空的子目录(因为--include="*/"包含了目录),这和你最初想跳过子文件夹的需求不符。而第二个单独处理abcd文件夹的命令更是画蛇添足,导致最终结果混乱。
备注:内容来源于stack exchange,提问作者Minja Culic




