我的目录中有数百万张 gif 图像。对于 rm 命令来说太多了。
我一直在尝试这样的查找命令:
find . -name "*.gif" -print0 | xargs -0 rm
问题是,它严重拖慢了我的计算机,并且由于它是一台服务器,导致客户超时。
有没有办法可以更快地删除所有这些文件...而无需锁定机器?
答案1
更快不一定是你想要的。你可能想实际运行慢点,因此删除操作在运行时消耗的资源更少。
使用很好(1)降低命令的优先级。
nice find . -name "*.gif" -delete
对于 I/O 密集型进程,nice(1) 可能不够用。Linux 调度程序确实考虑了 I/O,而不仅仅是 CPU,但您可能希望对 I/O 优先级进行更精细的控制。
ionice -c 2 -n 7 find . -name "*.gif" -delete
如果这不起作用,您还可以添加睡眠来真正减慢速度。
find . -name "*.gif" -exec sleep 0.01 \; -delete
答案2
由于您正在运行 Linux,并且此任务可能是 I/O 密集型的,我建议使用以下命令为您的命令提供空闲 I/O 调度程序优先级ionice(1)
:
ionice -c3 find . -name '*.gif' -delete
与您的原始命令相比,我猜这甚至可以通过避免管道来节省更多的 CPU 周期xargs
。
答案3
不。
除了软格式化磁盘外,没有更快的方法。将文件交给 rm立刻(在命令行的限制内,也可以设置为xargs
)这比对每个文件调用 rm 要好得多。所以,绝对没有更快的方法。
使用nice
(或renice
在正在运行的进程上)只能起到部分作用,因为这是用于调度中央处理器资源,而不是磁盘!而且 CPU 使用率会非常低。这是 Linux 的一个弱点 - 如果一个进程“吃掉”了磁盘(即大量使用磁盘),整个机器就会卡住。修改内核以实现实时使用可能是一个解决方案。
我在服务器上要做的事情是手动让其他进程完成它们的工作 - 包括暂停以保持服务器“呼吸”:
find . -name "*.gif" > files
split -l 100 files files.
for F in files.* do
cat $F | xargs rm
sleep 5
done
每处理 100 个文件后,系统会等待 5 秒。虽然耗时更长,但您的客户不会注意到任何延迟。