删除大量的文件

我在我的/ tmp有8百万个文件,我需要删除它们。 这台服务器也运行相当重要的应用程序,我不能超载。

我正在使用小php脚本:

<?php $dir = "/tmp"; $dh = opendir( $dir); $i = 0; while (($file = readdir($dh)) !== false) { $file = "$dir/$file"; if (is_file( $file) && (preg_match("/open/", $file))) { unlink( $file); #echo $file; if (!(++$i % 10000)) { echo "$i files removed\n"; } } } ?> 

但它使我的应用程序无法访问,即使:$ ionice -c 3 php ./tmp_files_killer.php $ nice -n 20 php ./tmp_files_killer.php

我已经改变了我的脚本,所以它不会一直读取/ tmp目录:

 $ ls -1 /tmp > tmp_files_list.txt <?php $file = "tmp_files_list.txt"; $infile = fopen($file, "r"); while ( !feof( $infile ) ) { $line = rtrim( fgets( $infile ), "\n\r" ); if ($line != null){ $file = "$dir/$line"; unlink( $file); if (!(++$i % 10000)) { echo "$i files removed\n"; } # echo $line + "\n"; } } ?> 

但运行这个脚本也会减慢我的应用程序。 进程不加载CPU,我有足够的内存。

伙计们,如何删除这些文件?

你可以让脚本在“块”中运行,然后在每个块之间休眠。

在你的第二个版本中,你可以在echo之后添加一个sleep(),比如30秒。 如果您调整删除的文件数量和睡眠时间,它应该保持服务器响应,同时仍然充分执行。

将来,你应该定期从cron运行一个清理工作来阻止自己到达这一点。

如果你可以直接在linux终端上执行命令,那么这个过程就会变得非常简单,直接执行这个命令即可

 find /tmp -type f -exec rm -v {} \; 

另外如果你想定期执行这个过程,那么你可以配置一个cronjob在午夜运行,你的服务器将几乎空闲

我将以不同的方式解决这个问题:一次性销毁整个文件系统。

创建一个新的文件系统 – 它可以是一个简单的tmpfs文件系统,它可以是一个ext2或ext3文件系统,可以是一个新的驱动器(USB记忆棒?),任何东西。

然后,将/tmp挂载点改为另一个名称,在/tmp上挂载新的文件系统,然后在曾经是/tmp分区上运行mke2fs ,然后从头开始编写一个全新的干净的文件系统。

重新创建旧的tmp设备之后,您可以再次执行这些步骤 – mv /tmp /new-tmp ,复制应该是持久性的数据, mount重新格式化的设备重新mount/tmp, ,然后复制应该坚持的数据。

当我想要清理上传目录时,我做了这样的事情。 这真的很长…所以我决定用命令rm /path/to/clean/*尝试exec()命令,而且速度非常快。

不是很干净,但至少对我来说很好。

是否需要使用PHP脚本进行清理?

如果没有,看看这篇文章 …应该给你几个想法

这可能是删除/ tmp下的所有文件的更快,更标准的方法:

 find /tmp -type f -exec rm {} + 

用Gnu发现,这可能会稍微快一点:

 find /tmp -type f -delete 

如果/ tmp在自己的文件系统上,只需卸载和mkfs它。 如果是tmpfs,只需重新启动。