xargs 命令很有用,能将 STDIN 转换成特定的命令行参数以及将单行或者多行文本输入转换成其他格式。通常和 find 命令一起使用比较多。

xargs 跟在管道操作符后面command | barges这种形式

常用场景

1.多行输入转化成单行输出,xargs 可以用空格替换掉换行符

[root@localhost training]# cat index.txt
this is shell xargs
example
haha ,just do it
[root@localhost training]# cat index.txt | xargs
this is shell xargs example haha ,just do it

2.单行输入转化成多行输出,指定每行最大的数量参数 n,用默认的空格定界符风格字符串

[root@localhost training]# cat index2.txt
this is shell xargs example haha ,just do it
[root@localhost training]# cat index2.txt | xargs -n 3
this is shell
xargs example haha
,just do it

3.结合 find 命令,和 find 的-exce 有点类似 *a.*删除 find 输出结果的文件

[root@localhost training]# ls
index2.txt index.txt
[root@localhost training]# find . -type f -name "*.txt" -print0 | xargs -0 rm -f

这里需要注意的是为什么用-print0 而不是-print 就可以了,因为 find 输出结果无法确定定界符是‘\n’还是空格‘ ’,有些文件如果文件或者目录名中含有空格,比如 yuansir web.txt,你删除的就是./yuansir 和 web.txt 了,所以 find -print0 以字符 null 分割输出,xargs -0 将\0 作为输入定界符。

*b.*统计目录文件行数

[root@localhost training]# find /home/wwwroot/yii/framework/ -type f -name "*.php" -print0 | xargs -0 wc -l
608006 总计

这样就统计出 Yii 的 framework/目录中 php 文件的代码行数了

*c.*打包 find 输出文件

[root@localhost training]# touch {a..z}.gif
[root@localhost training]# ls
a.gif c.gif e.gif g.gif i.gif k.gif m.gif o.gif q.gif s.gif u.gif w.gif y.gif
b.gif d.gif f.gif h.gif j.gif l.gif n.gif p.gif r.gif t.gif v.gif x.gif z.gif
[root@localhost training]# find . -type f -name "*.gif" -print0 | xargs -0 tar zcvf images.tar.gz
[root@localhost training]# tar tvf images.tar.gz
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./l.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./e.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./p.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./j.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./i.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./h.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./o.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./b.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./n.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./v.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./c.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./z.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./d.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./r.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./y.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./m.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./a.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./f.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./k.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./u.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./w.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./g.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./x.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./t.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./q.gif
-rw-r--r-- root/root 0 2013-01-16 05:25:54 ./s.gif

*d.*下载文件中的下载链接

[root@localhost training]# cat download-url-list.txt | xargs wget –c

4.利用-I {} 从 STDIN 中读取作为参数,有点类似于循环中{}替换成相应参数。

[root@localhost training]# cat test1.txt test2.txt test3.txt
this is test 1 file
this is test 2 file
this is test 3 file
[root@localhost training]# cat test.txt
test1.txt
test2.txt
test3.txt
[root@localhost training]# cat test.txt | xargs -I {} cat {}
this is test 1 file
this is test 2 file
this is test 3 file

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: 好记性不如烂笔头 Linux xargs 命令

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可