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

关于Rsync --delete参数无法删除指定PNG文件的技术咨询

解决Rsync同步单个类型文件时--delete无效的问题

我太懂这个坑了!之前我在同步特定格式的媒体文件时也踩过一模一样的雷,让我帮你拆解清楚问题出在哪,以及怎么解决。

为什么你的命令会失效?

先逐个分析你遇到的情况:

  1. 第一次报错rsync --delete /home/pi/folder1/*.png /home/pi2/folder2/ 报错需要-r-d,是因为--delete是为目录同步场景设计的——它需要rsync对比源目录和目标目录的内容,而你这里给的源是一堆被shell展开后的单个.png文件,不是目录,rsync不知道要基于什么上下文去删除文件。
  2. 加了-r还是不行:你加了-r但源还是*.png,这些是文件不是目录,-r参数完全没发挥作用,rsync依然只处理你列出的单个文件,自然找不到目标目录里“多余”的png文件去删除。
  3. 同步整个目录能删但不能用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

火山引擎 最新活动