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

yha*_*ger 7 unix shell find xargs

在我的Web应用程序中,我使用PHP脚本呈现页面,然后从它们生成静态HTML文件.静态HTML将提供给用户以加快性能.HTML文件最终变得陈旧,需要删除.

我正在讨论两种编写驱逐脚本的方法.

第一个是使用单个find命令,比如

find /var/www/cache -type f -mmin +10 -exec rm \{} \;
Run Code Online (Sandbox Code Playgroud)

第二种形式是通过xargs管道,类似于

find /var/www/cache -type f -mmin +10 -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

第一个表单调用rm它找到的每个文件,而第二个表单只将所有文件名发送到一个rm(但文件列表可能很长).

哪种形式会更快?

在我的例子中,缓存目录在几个Web服务器之间共享,所以这一切都是通过NFS完成的,如果这个问题很重要的话.

tyl*_*erl 16

xargs版本的文件比你发布的-exec版本大得多,这是因为你要删除的每个文件rm都会执行一次,而xargs会将尽可能多的文件整合到一个rm命令中.

有数十或数十万个文件,它可能是一分钟或更短的时间与一小时的较好部分之间的差异.

通过使用"+"而不是"\;"完成命令,可以使用-exec获得相同的行为.此选项仅适用于较新版本find.

以下两个大致相同:

find . -print0 | xargs -0 rm
find . -exec rm \{} +
Run Code Online (Sandbox Code Playgroud)

请注意,在xargs多处理器系统上,该版本的运行速度仍会稍微提高一些(因为有些工作可以并行化).如果涉及大量计算,则尤其如此.


kby*_*yrd 6

我希望xargs版本稍快一些,因为你没有为每个文件名生成一个进程.但是,如果实践中存在很大差异,我会感到惊讶.如果您担心xargs发送到每个rm调用的长列表,您可以使用-l和xargs来限制它将使用的令牌数.但是,xargs知道最长的cmdline长度,并且不会超出这个范围.

  • 我认为如果参数的数量大于shell的最大值,xargs将自动(不带-l)生成多个进程. (3认同)