You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动