Shell 哪个更快';find-exec';或';查找| xargs-0';?

Shell 哪个更快';find-exec';或';查找| xargs-0';?,shell,unix,find,xargs,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 第一个

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

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

xargs版本比您发布的-exec版本更快,因为要删除的每个文件都会执行一次
rm
,而xargs将尽可能多的文件合并到一个
rm
命令中

对于数以万计或数十万个文件,一分钟或更短的时间与一小时的大部分时间之间可能存在差异

您可以通过使用“+”而不是“\;”来完成命令,从而获得与-exec相同的行为此选项仅在较新版本的
find
中可用

以下两者大致相当:

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

请注意,
xargs
版本在多处理器系统上的运行速度仍会稍快一些(提高几个百分点),因为一些工作可以并行化。如果涉及大量计算,这一点尤其正确。

find命令内置了-delete选项,这可能也很有用?

使用xargs比使用find的exec更快

我尝试使用xargs和exec计算具有js扩展名的node_模块文件夹中文件的行数。下面是输出

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

我认为,如果参数数量大于shell最大值,xargs将自动(不带-l)生成多个进程。谢谢。我不知道xargs能做到。很好,谢谢。我查看了手册页,在任何人想要使用find的-delete选项之前,有一个警告应该被理解。我不能把它粘贴在这里,但一定要仔细阅读那个人。我发现xargs是一种更快的方法。我花了将近两个小时浏览了前250000个文件。然后我偶然发现了这一点,并尝试了xargs。像冠军一样在半小时内完成了剩下的75万<代码>-exec+是POSIX标准的一部分,用于
查找
;对它的支持应该相当广泛。