首页 > Sysadmin > 正文

Linux 删除文件能看到进度吗

huyuanwen 2026-10-26 Sysadmin

很多人找 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 并行;普通文件删除本身很快,真正需要进度的是批量和大文件场景。


参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测,个别条目(未装工具/安装类命令)仅核对官方文档,未实际执行。