xargs

xargs是给命令传递参数的一个过滤器,可以将管道或者标准输入的数据转换成参数,默认命令为echo, 这意味着通过管道传递给xargs的输入将会包含换行,不过通过xargs的处理,换行将被空格取代。

  • xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。

  • xargs 也可以将单行或多行文本输入转换为其他格式,例如多行变单行,单行变多行。

  • xargs 默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。

  • xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令。

  • 使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报错"参数列表过长",而无法执行,改用xargs就没有这个问题,因为它对每个参数执行一次命令

基本语法

xargs options command

参数:

-0 : 如果stdin含有特殊字符,将特殊字符还原成一般字符, xargs命令的-0参数表示用null当作分隔符
-a file 从文件中读入作为stdin
-e flag 注意有的时候也会是-E, flag必须是一个以空格分割的标志,当xargs分析到含有flag这个标志的时候就停止
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是所有的
-t 表示先打印命令,然后再执行
-i / -I 将xargs的每项名称,一般是一行一行赋值给{}, 可以用{}代替
-s num 命令行的最大字符数,指xargs后面那个命令的最大命令行字符数
-L num 从标准输入一次读取num行送给command命令
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符
-p 询问
-P 修改最大的进程数

例子

  1. 统计源代码目录中所有c文件的行数

    find . -type f -name “*.c” -print0 | xargs -0 wc -l

[root@iz2zecj7a5r32f2axsctb9z shell]# find . -type f -name "*.c" -print0 | xargs -0 wc -l
   10 ./a.c
   43 ./linux-shell/c/ifconfig/lsif.c
  229 ./linux-shell/c/ifconfig/uif.c
    7 ./linux-shell/c/extern/main.c
    9 ./linux-shell/c/extern/extern.c
   14 ./linux-shell/c/byteAlign/byteAlign3.c
  1. rm 删除文件

find . -type f -name “*.log” -print0 | xargs -0 rm -f

  1. 将图片复制到目录/data/images下

ls *.jpg | xargs -n 1 -I {} cp {} /data/images

  1. 列出当前目录下所有包含php字符的文件的文件名

    find . -type f -print0 | xargs -0 grep -l “php”

[root@iz2zecj7a5r32f2axsctb9z include]# find . -type f -print0 | xargs -0 grep -l "php"
./ImageMagick-6/magick/enhance.h
./ImageMagick-6/magick/prepress.h
./ImageMagick-6/magick/composite.h
./ImageMagick-6/magick/property.h
./ImageMagick-6/magick/log.h
./ImageMagick-6/magick/identify.h
./ImageMagick-6/magick/locale_.h
....
  1. 运行多个命令

    echo file1 file2 file3 | xargs -t -I {} sh -c ‘touch {}; ls -l {}’

[root@iz2zecj7a5r32f2axsctb9z shell]# echo file1 file2 file3 | xargs -t -I {} sh -c 'touch {}; ls -l {}'
sh -c touch file1 file2 file3; ls -l file1 file2 file3 
-rw-r--r-- 1 root root 0 3月   5 20:20 file1
-rw-r--r-- 1 root root 0 3月   5 20:20 file2
-rw-r--r-- 1 root root 0 3月   5 20:20 file3
  1. 指定一个分隔符

    echo -n file1#file2#file3 | xargs -d # -t touch

[root@iz2zecj7a5r32f2axsctb9z shell]# echo file1#file2#file3 | xargs -d \# -t touch
touch file1 file2 file3
  1. 从文件中读取条目

    xargs -a ip.txt -t -L 1 ping -c 1

[root@iz2zecj7a5r32f2axsctb9z shell]# xargs -a ip.txt -t -L 1 ping -c 1
ping -c 1 114.114.114.114 
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=84 time=29.0 ms

--- 114.114.114.114 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 29.040/29.040/29.040/0.000 ms
ping -c 1 www.baidu.com 
PING www.a.shifen.com (220.181.38.150) 56(84) bytes of data.
64 bytes from 220.181.38.150 (220.181.38.150): icmp_seq=1 ttl=53 time=3.53 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 3.533/3.533/3.533/0.000 ms
ping -c 1 www.gitee.com 
PING fn0wz54v.dayugslb.com (212.64.62.183) 56(84) bytes of data.
64 bytes from 212.64.62.183 (212.64.62.183): icmp_seq=1 ttl=52 time=36.8 ms

--- fn0wz54v.dayugslb.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 36.806/36.806/36.806/0.000 ms
  1. 列出当前目录下所有包含main单词的文件的文件名, 只有文件名,不包含路径

    find . -type f -name “*.c” -print0 | xargs -0 grep -l -w “main” | xargs -L 1 basename

[root@iz2zecj7a5r32f2axsctb9z shell]# find . -type f -name "*.c" -print0 | xargs -0 grep -l -w "main" | xargs -L 1 basename
a.c
lsif.c
uif.c
main.c
byteAlign3.c
byteAlign2.c
byteAlign1.c
byteAlign.c
server2.c
文档更新时间: 2021-03-05 20:43   作者:周国强