在我的Web应用程序中,我使用PHP脚本呈现页面,然后从中生成静态HTML文件。静态HTML将提供给用户以加快性能。 HTML文件最终变得陈旧,需要删除。
我正在讨论两种编写驱逐脚本的方法。
第一种是使用单个find命令,例如
find /var/www/cache -type f -mmin +10 -exec rm \{} \;
第二种形式是通过xargs管道,类似
find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm
第一个表单为找到的每个文件调用rm
,而第二个表单只将所有文件名发送到单个rm
(但文件列表可能很长)。
哪种形式会更快?
就我而言,缓存目录在几个Web服务器之间共享,所以这一切都是通过NFS完成的,如果这对此问题很重要。
答案 0 :(得分:15)
xargs版本的文件比你发布的-exec版本要快很多,这是因为rm
对你要删除的每个文件执行一次,而xargs会将尽可能多的文件整合到一个rm
命令中。
有数十或数十万个文件,它可能是一分钟或更短的时间与一小时的好时间之间的差异。
通过使用“+”而不是“\;”完成命令,可以使用-exec获得相同的行为。 此选项仅适用于较新版本的find
。
以下两个大致相同:
find . -print0 | xargs -0 rm
find . -exec rm \{} +
请注意,xargs
版本在多处理器系统上的运行速度会稍微提高一些(因为有些工作可以并行化)。如果涉及大量计算,则尤其如此。
答案 1 :(得分:6)
我希望xargs版本稍快一些,因为你没有为每个文件名生成一个进程。但是,如果实践中存在很大差异,我会感到惊讶。如果你担心xargs发送到rm的每个调用的长列表,你可以使用-l和xargs来限制它将使用的标记的数量。但是,xargs知道最长的cmdline长度,并且不会超出该范围。
答案 2 :(得分:2)
find命令内置了一个-delete选项,也许这也有用吗? http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html
答案 3 :(得分:1)
与使用find的exec相比,使用xargs更快。
我尝试使用xargs和exec计算js扩展名的node_module文件夹中文件的行数。所以下面的输出。
time find . -type f -name "*.js" -exec wc -l {} \;
real 0m0.296s
user 0m0.133s
sys 0m0.038s
time find . -type f -name "*.js" |xargs wc -l
real 0m0.019s
user 0m0.005s
sys 0m0.006s
xargs的执行速度比exec快15倍。