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

问题描述 投票:7回答:4

在我的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完成。

shell unix find xargs
4个回答
6
投票

我希望xargs版本会稍快一些,因为您不会为每个文件名生成一个进程。但是,如果实际上有很大的不同,我会感到惊讶。如果您担心xargs发送给rm每次调用的长列表,则可以将-l与xargs一起使用以限制它将使用的令牌数量。但是,xargs知道最长的cmdline长度,并且不会超出该长度。


17
投票

与您发布时的-exec版本相比,具有许多文件的xargs版本具有显着更快的速度,这是因为rm被执行了[[每个文件一次],而xargs将集结了许多文件一起合并到单个rm命令中。

对于成千上万的文件,可能是一分钟或更短的时间与一个小时的大部分时间之差。

您可以通过使用-+而不是“ \;”结束命令来使用-exec获得相同的行为。

此选项仅在find的较新版本中可用。>以下两个大致等效:

find . -print0 | xargs -0 rm find . -exec rm \{} +

请注意,xargs版本在多处理器系统上仍会稍快一些(百分之几),因为某些工作可以并行化。如果涉及大量计算,则尤其如此。

2
投票
find命令内置了-delete选项,也许也可能有用吗?http://lists.freebsd.org/pipermail/freebsd-questions/2004-July/051768.html

1
投票
与使用find的exec相比,使用xargs更快。
© www.soinside.com 2019 - 2024. All rights reserved.