关于Rsync --delete参数无法删除指定PNG文件的技术咨询
解决Rsync同步单个类型文件时--delete无效的问题
我太懂这个坑了!之前我在同步特定格式的媒体文件时也踩过一模一样的雷,让我帮你拆解清楚问题出在哪,以及怎么解决。
为什么你的命令会失效?
先逐个分析你遇到的情况:
- 第一次报错:
rsync --delete /home/pi/folder1/*.png /home/pi2/folder2/报错需要-r或-d,是因为--delete是为目录同步场景设计的——它需要rsync对比源目录和目标目录的内容,而你这里给的源是一堆被shell展开后的单个.png文件,不是目录,rsync不知道要基于什么上下文去删除文件。 - 加了
-r还是不行:你加了-r但源还是*.png,这些是文件不是目录,-r参数完全没发挥作用,rsync依然只处理你列出的单个文件,自然找不到目标目录里“多余”的png文件去删除。 - 同步整个目录能删但不能用:
rsync --delete /home/pi/folder1/ /home/pi2/folder2/有效是因为rsync会完整对比两个目录的所有内容,删掉目标里源目录没有的东西,但这会把folder2里你要保留的其他文件也删掉,显然不符合需求。
正确的解决方案:用过滤规则限定同步范围
要实现“只同步folder1的png文件,同时删除folder2里不再存在于folder1的png,且保留其他文件”,你需要用--include和--exclude来精准过滤,命令如下:
rsync --delete -r --include='*.png' --exclude='*' /home/pi/folder1/ /home/pi2/folder2/
命令解释:
-r:递归扫描源目录(即使folder1里没有子目录,加这个也不影响,反而能确保覆盖所有层级的png文件)--include='*.png':告诉rsync只处理.png格式的文件--exclude='*':排除所有其他类型的文件和目录,确保rsync不会碰png以外的内容--delete:现在rsync是基于目录同步(源是folder1/,目标是folder2/),它会对比两个目录下的png文件,自动删除folder2里存在但folder1中已移除的png,同时完全不会干扰folder2里的其他文件。
额外提醒:别用shell通配符指定单个文件类型
你之前用*.png的问题在于,shell会先把通配符展开成当前目录下的所有png文件名,rsync收到的是一堆零散的文件路径,不是一个目录结构,所以--delete没有办法判断目标目录里哪些文件是“多余”的。用include/exclude的方式,rsync是在目录层面进行对比,才能正确执行删除逻辑。
内容的提问来源于stack exchange,提问作者newdeveloper




