哪个更快,'find -exec'或'find | xargs -0'?

时间:2009-06-11 10:36:13

标签: shell unix find xargs

在我的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完成的,如果这对此问题很重要。

4 个答案:

答案 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倍。