xargs命令解决“Argument list too long”

一、xargs命令概述

        xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具。它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。空格是其默认定界符,管道传递给xargs的输入会包含换行和空格,不过通过xargs的处理,换行和空格将被空格取代。

下图xargs接收标准输入的方式

下图是将标准输入转换成rm的参数。

xargs命令解决“Argument list too long”_第1张图片

下图使用了管道,管道符“|”,这个符号可以将一个命令的标准输出转换为另外一个命令的标准输入。

管道符的使用有两个条件:

1、管道命令只能处理前一个命令的标准输出,而不能处理标准错误;

2、管道命令右边命令必须能够接收标准输入。

二、xargs使用场景

        很多程序是不处理标准输入的,例如 kill , rm 这些程序如果命令行参数中没有指定要处理的内容则不会默认从标准输入中读取。

        上面的命令执行失败,是因为rm接受命令行参数中指定的处理内容,不从标准输入中获取处理内容。而xargs能够处理管道或者stdin并将其转换成特定命令的命令参数。可以通过下图操作处理。xargs接收标准输入的内容并转换为rm的命令行参数。

        常见的能处理标准输入的命令有cat、grep、xargs、wc...

三、xargs命令以及与管道的区别

        xargs能够处理管道或者stdin并将其转换成特定命令的命令行参数;

管道是将一个命令的标准输出转换为另外一个命令的标准输入;

举例对比:

1、执行命令echo '--help' | cat

可以看到管道将标准输出转换为标准输入给cat命令,作为cat命令的处理内容,然后显示出来。

2、执行命令echo '--help'|xargs cat

xargs命令解决“Argument list too long”_第2张图片

        以上命令管道将标准输出转换为标准输入给xargs,xargs将标准输入转换为cat命令的命令参数,实际等价于cat --help。

四、xargs常用选项使用

        xargs不仅能将标准输入转换为后面命令的参数,它还可将标准输入分割为批,每批中有很多分割片段,片段默认按空格分隔,然后将这些片段按批交给xargs后面的命令进行处理。

        -d 自定义分隔符,默认是空白(空格、tab、回车换行)

        -n 设定多少片段为一批,将分批的参数传递给后面的命令作为参数执行。这个特性可以用于解决参数过长问题,如:-bash: /usr/bin/cp: Argument list too long。

xargs命令解决“Argument list too long”_第3张图片

        -i 使用{}作为替换符,这个字符串在命令运行时将替换为参数,每个参数命令都会被执行一次。如果不使用-i,则默认是将分割处理后的结果整体传递到【命令的最尾部】。但是有时候需要传递到多个位置,不使用-i就不知道传递到哪个位置了。这里看到使用i选项后,参数都是一个一批,最好不要和-n一同使用,如-n1可以,-n2就会异常。

        -t 先打印命令,在执行。如下图所示,可以看到xargs的默认命令是echo。

        -p 每执行一个参数询问一次用户。

五、案例

        rm、cp 、mv使用过程中遇到参数过长问题。

        删除文件最简单的方法是 rm ./*,当要删除的文件过多时会报 Argument list too long 这个错误。原因是 bash 会将 rm ./* 匹配到的文件都展开,生成一个非常长的命令,linux 内核对 command 长度有限制。getconf ARG_MAX可以查看长度。这时可以使用 xargs 来删除大量文件。

        1、ls ./* | xargs rm -rf

xargs 会将匹配到的文件以合理的长度传给 rm -rf,相当于是将文件分组删除。

        2、find . -name "*.log" |xargs -i cp {} /tmp/test

        3、统计文件数

                按10000个文件一行,共200行

        [root@localhost test]# ls |xargs -n 10000|wc -l

                        200

        4、查看三台服务器上nginx进程情况

                echo "192.168.0.1 192.168.0.2 192.168.0.3" \

                | xargs -i ssh root@{} 'ps aux | grep nginx'

你可能感兴趣的:(CentOS,服务器,linux,运维)