删除数百万个文件

删除数百万个文件

我的目录中有数百万张 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 秒。虽然耗时更长,但您的客户不会注意到任何延迟。

答案4

你有没有尝试过:

find . -name "*.gif" -exec rm {} +

末尾的 + 号将使 find 包含更多文件,以便执行单个 rm 命令。检查这个问题更多细节。

相关内容