mrsaynothing.dev
rsync command generator——先 dry-run,删除带安全网

> rsync command generator——先 dry-run,删除带安全网▋

大多数 rsync 命令生成器只负责拼参数,剩下的听天由命。这个默认先跑 dry-run,并且拒绝裸奔的 --delete:备份安全网让每一次镜像都可回退。

mrsaynothing· 2026年10月16日· 1 分钟读完

同步和抹除之间差什么?通常就一个参数。敲下 rsync -a --delete /mnt/empty-usb/ /home/you/,rsync 会忠实地让目标向源看齐——包括"你的家目录现在空了"这一部分。我能在第一页找到的每个生成器都乐呵呵地把这个参数藏在复选框后面;其中一家甚至给自己的输出标注"AI 生成、尚未验证有效性"——敢把这话印在删除命令上方,也算种勇气。这个工具拒绝的正是这个谎言:拼出 rsync 语法和理解 rsync 语义是同一件事。rsync command generator 已上线——它生成命令、用大白话点破陷阱,并把 --delete 当成上了膛的枪来对待。

为什么 --delete 值得一个警告?

因为 rsync 的契约是让目标与源一致,而 --delete 把这份契约扩展到了删除。手册页说得很直白:这个参数的含义是"delete extraneous files from the destination dir"。所谓 extraneous,就是源端没有的一切——包括仅仅因为你指错了源、挂错了 U 盘、路径打错一个字而"缺失"的东西。生成器的职责是让这个后果在命令运行之前就被看见,而不是之后:

参数 它做什么 你用错时它做什么
--delete 目标中在源里不存在的文件会被删除 源路径写错 → 目标文件成了"extraneous" → 没了
src/ vs src 结尾斜杠复制的是内容;不带斜杠复制目录本身 一个字符,目标的目录结构完全不同
-a 归档:递归 + 权限、时间、属主、符号链接 漏掉 → 一份悄悄"不算备份"的备份
--partial 中断时保留传了一半的文件 链路不稳 → 整个传输从零重来

结尾斜杠这一行是经典案例。rsync 自己的文档写着:源末尾加斜杠"changes this behavior to avoid creating an extra directory at the destination"——翻译成大白话就是:src/ 把内容倒进目标,src 则先创建 dest/src 再把内容倒进去。两个字符的事。生成器会在你输入的同时显示当前生效的是哪一句,因为结尾斜杠也是唯一一个吃掉的家目录比 rm -rf 还多的 rsync 参数。

怎么安全地给删除上膛

不是拆掉保险——而是加一张网。生成器的上膛流程分两步:命令默认带着 --dry-run,你先读一遍将会发生什么;然后才拨动上膛开关跑真的一次。而一旦涉及 --delete,工具拒绝输出裸删除。它会追加安全网:

rsync -a --delete \
  --backup --backup-dir=/mnt/backup/_rsync_backup_$(date +%F) \
  /mnt/usb/ /mnt/backup/

设好 --backup --backup-dir 之后,rsync 不会销毁它删除或覆盖的文件——而是先把它们挪到一边,放进带日期的文件夹。镜像最终照样精确。等你发现挂载的是错误的源那天,你的文件正躺在 _rsync_backup_2026-10-16/ 里,而不是变成一节教训。可回退,就是镜像和回忆之间的区别。

可以:rsync -a --delete --backup --backup-dir=DEST/_rsync_backup_$(date +%F) SRC/ DEST/。这两个安全网参数会把每个被删除或覆盖的文件挪进带日期的文件夹而不是直接抹掉,镜像保持精确,删除保持可回退。先用 -n 跑 dry-run,读一遍列表,再上膛。

验证:man rsync → --backup 写着"make a backup of every file installed" · --backup-dir 的各条目落在 DEST/_rsync_backup_<date>/,而不是虚空

生成器接了哪些参数

覆盖几乎所有真实传输的参数集,按你实际做决策的方式分组:

  • 路径——两侧都可以本地或远程(user@host:/path),SSH 端口不是 22 时通过 -e "ssh -p 2222" 接入。
  • 方向——结尾斜杠开关,"内容还是目录"那句话实时显示。
  • 过滤器——--exclude 模式,附带常客预设:.git、node_modules、缓存、日志。
  • 分寸——-z 压缩、--bwlimit 让凌晨 3 点的备份别再占满全家带宽、-P 管进度和续传、-c 在 mtime 说谎时用。
  • 上膛车道——默认 dry-run、显式上膛步骤、任何 --delete 自动挂安全网。

输出是一行可直接粘贴的命令(或带反斜杠的多行,随终端喜好),外加一段可嵌入的代码片段,想把生成器搬上自己的页面就用它。和 GGUF VRAM 计算器一样,它是单个 HTML 文件在你的浏览器里做算术——你输入的东西不离开页面,讲安全复制的工具不该向外打电话。

它在工具箱里的位置

生成器负责拼命令;理论在兄弟篇里。Rsync 对比 scp 讲的是 rsync 的增量传输为什么胜过笨复制、以及 scp 什么时候依然够用。Cron 对比 systemd 定时器是排程那一半——生成器拼出的 rsync 命令直接丢进定时器,至于"到底跑没跑"的日志那一半,在 journalctl 速查表里。

跳过的 dry-run,就是一次并非你本意的删除。

工具在 github.com/mrsaynothing/rsync-builder——MIT 协议、单个文件、无需构建。如果哪天你嫌上膛流程啰嗦,那说明这个功能正在起作用;如果你能说出一种安全网覆盖不到的参数组合,去提 issue——危险的角落恰恰最值得画进地图。

$ 下一篇构建日志,直达邮箱

每篇一封。附证据与错误。

self-hosted · 无第三方 · 一键退订

每周一封邮件。零跟踪像素。

这是什么?