exec和xargs的区别

当在执行命令:

$ find . -name '*.log' -type f -exec rm {} /;

时,find -exec 命令会对匹配的每个文件执行单独的rm操作,就像:

rm ./1.log
rm ./2.log
rm ./3.log

进程越多,性能耗费就越大,删除也越慢。我们可以将多个文件做为参数传给rm,如:

rm ./1.log ./2.log ./3.log

前提是命令必须支持多参数,有些命令,比如unzip,就不支持输入多个参数,所以必须用-exec。

后由lfree指出,-exec也可以将多行内容作为参数传给执行的命令,使用方法为:find -exec command {} \+,具体参考lfree的博文:[20160425]find -exec command {} \+.txt

xargs
顾名思义,是对参数进行处理的命令。它的任务就是将输入行转换成下一个命令的参数列表。因此上面的find -exec命令可以改写成:

find . -name '*.log' -type f -print | xargs rm

需要注意的是,操作系统允许的最大参数长度,如果过长,则命令会失败。检查操作系统参数最大长度,如下:

$ getconf ARG_MAX
2621440

如果要删除的文件很多,可以使用如下方法:

ls | xargs -n 100 rm -rf

其中-n 100,将100个参数做为一批,传给rm命令,这样就解决参数过长的问题

关于紫砂壶

感悟技术人生
此条目发表在操作系统分类目录,贴了标签。将固定链接加入收藏夹。

3 则回应给 exec和xargs的区别

  1. lfree说:

    find 可以使用\+ 规避 这个问题.

    find -exec command {} \+

    \http://blog.itpub.net/267265/viewspace-2087968/

  2. lfree说:

    http://blog.itpub.net/267265/viewspace-2087968/

    find 可以使用\+ 代替
    find -exec command {} \+

评论已关闭。