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多处理器系统上,该版本的运行速度仍会稍微提高一些(因为有些工作可以并行化).如果涉及大量计算,则尤其如此.
我希望xargs版本稍快一些,因为你没有为每个文件名生成一个进程.但是,如果实践中存在很大差异,我会感到惊讶.如果您担心xargs发送到每个rm调用的长列表,您可以使用-l和xargs来限制它将使用的令牌数.但是,xargs知道最长的cmdline长度,并且不会超出这个范围.