很多人找 rm 的进度选项,但 GNU coreutils 手册里 rm 的选项列表没有任何进度项,rm --progress 直接报 unrecognized option [1]。想看到进度,只能换工具。
find:-print -delete 逐行打印
find /data/logs -print -delete
-print 的含义是 “print the entire file name on the standard output”,-delete 删除匹配到的文件,删一个打印一个路径,删到哪一眼就能看到 [2]。我在临时目录实测:三个文件加两个子目录,输出六行路径后全部清空。稳妥的做法是先只跑一次 -print,确认匹配范围符合预期,再加 -delete,避免误删整个目录树。
rsync:空目录镜像清空
mkdir -p /tmp/empty
rsync -a --delete --progress /tmp/empty/ /data/cache/
把 rsync 指向一个空目录,目标里所有多余文件都会被删:--delete 即 “delete extraneous files from dest directories”,--progress 即 “show progress during transfer” [3]。实测输出逐行 deleting x、deleting y,目录清空但目录本身保留。末尾的斜杠表示镜像的是目录内容;rsync 要先比较两侧文件列表,文件特别多时反而更慢,适合中等规模、需要可视化进度的场景,想看整体百分比可换成 --info=progress2。
超大单个文件:先清空再删
truncate -s 0 big.log && rm big.log
truncate -s 0 把文件大小置为零(GNU coreutils 手册),实测 256 MB 文件置零后 rm 几乎瞬间完成。至于 pv,官方定义是 “monitoring the progress of data through a pipeline”——它是管道监控工具,不是删除工具;把它插进管道只能观察读写速率,帮不了 rm [5]。
海量小文件:xargs -P 并行
删除百万个小文件之所以慢,是因为每个文件都要单独一次元数据操作,而默认 “xargs runs one command at a time”——单进程串行等待,瓶颈不在数据本身。-P 可以 “Run up to max-procs processes at a time” [4],实测删 200 个文件用 -P 4 并行瞬间完成:
find /data/spool -mindepth 1 -maxdepth 1 -print0 \
| xargs -0 -P 4 -n 1000 rm -rf
-print0 与 -0 配对,带空格的文件名也不会被拆错。
一句话:rm 没有进度条——逐行看用 find,带进度用 rsync,大文件先 truncate,小文件多则 xargs 并行;普通文件删除本身很快,真正需要进度的是批量和大文件场景。
参考资料
- [1] rm invocation — GNU coreutils manual(rm)
- [2] GNU findutils manual(findutils)
- [3] rsync(1) — man page(rsync)
- [4] Controlling Parallelism — GNU findutils(xargs)
- [5] pv — pipes and filters(pv)
文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。