Linux入门之玩转xargs命令

共 5220字,需浏览 11分钟

 ·

2021-03-10 03:30

  本文将介绍Linux中的xargs命令。
  在Linux系统中,有些命令只能以命令行参数的形式接受数据,而无法通过stdin接受数据流。xargs正好擅长此道!xargs擅长将标准输入数据转换成命令行参数,使其适用于多种问题场景!

工作原理

  xargs命令可以用自己的定界符来分隔参数,默认定界符为" "(空格)。用-d选项为输入指定一个定制的定界符,如下:

echo "splitXsplitXsplitXsplitXsplit" | xargs -d X
split split split split split

在上述命令中,因为指定X为定界符,因此xargs命令会将字符串splitXsplitXsplitXsplitXsplit变成split split split split split。
  结合-n选项,可以将输入划分成多行,每行n个参数,比如我们将-n设置成2,如下:

echo "splitXsplitXsplitXsplitXsplit" | xargs -d X -n 2
split split
split split
split

  借助上述操作,我们可以将多行输入转换成单行输入,如下:

$ cat example.txt 
1 2 3 4 5 6
7 8 9 
10
$ cat example.txt | xargs
1 2 3 4 5 6 7 8 9 10

实战演练

例1. 统计Python脚本的代码行数

  比如我们想统计某个文件夹下的Python脚本的代码行数,我们可以使用ls -1 *.py命令找到所有Python脚本,借助xargs转换成命令行参数,再使用wc -l统计文件的行数即可。演示如下:

$ ls -1 *.py
common.py
main.py
server.py
util.py
$ ls -1 *.py | xargs wc -l
   6 common.py
  17 main.py
  82 server.py
 170 util.py
 275 总用量

这样我们使用一行命令就能统计该文件夹下所有Python脚本的代码行数。
  借助xargs中的-p参数让 xargs 提示我们是否要进行下一步的操作,同时还能看到下一步的操作是怎样的。

$ ls -1 *.py | xargs -p wc -l
wc -l common.py main.py server.py util.py ?...y
   6 common.py
  17 main.py
  82 server.py
 170 util.py
 275 总用量

在上述例子中,使用了-p后输入命令会提示是否执行wc -l common.py main.py server.py util.py ?命令,我们输入y运行该命令。

例2. 创造多个文件夹

  本例将演示如何使用xargs创建多个文件夹,比如创建example1至example10共10个空文件夹。
  首先创建example.txt,每行含有example{n},其中n为1-10,再使用xargs转换成命令行参数,最后使用mkdir命令创建文件夹。如下:

$ cat example.txt 
example1
example2
example3
example4
example5
example6
example7
example8
example9
example10
$ cat example.txt | xargs -p mkdir
mkdir example1 example2 example3 example4 example5 example6 example7 example8 example9 example10 ?...y

  xargs中的-I参数指定替换字符串,这个字符串在xargs扩展时会被替换掉。同时使用sh -c命令可以启动一个新的子shell,它会让我们的命令更具有可读性,如下:

$ cat example.txt | xargs -I % sh -c "echo make directory: %; mkdir %"
make directory: example1
make directory: example2
make directory: example3
make directory: example4
make directory: example5
make directory: example6
make directory: example7
make directory: example8
make directory: example9
make directory: example10

例3. 删除多个文件夹

  本例演示如何使用xargs命令删除多个文件夹,比如删除example1至example10共10个空文件夹。
  命令如下:

cat example.txt | xargs -p rm -rf
rm -rf example1 example2 example3 example4 example5 example6 example7 example8 example9 example10 ?...y

或者使用命令如下:

$ cat example.txt | xargs -I {} sh -c "echo delete directory: {}; rm -rf {}"
delete directory: example1
delete directory: example2
delete directory: example3
delete directory: example4
delete directory: example5
delete directory: example6
delete directory: example7
delete directory: example8
delete directory: example9
delete directory: example10

例4. print0参数

  比如我们的文件名中含有空格,这时候使用xargs可能会出错。
  我们创建两个文件:good morning.txt和good afternoon.txt,使用xrags将其删除,如下:

$ touch "good morning.txt"
$ touch "good afternoon.txt"
$ ls -1 *.txt | xargs rm -rf
$ ls -1
总用量 0
good afternoon.txt
good morning.txt

  一种方式是使用-I参数,如下:

$ ls -1 *.txt | xargs -I {} rm -rf "{}"
$ ls -1

  另一种方式为将find指令加上-print0参数,另外將 xargs 指令加上-0参数,如下:

$ find -name "*.txt" -print0 | xargs -0 rm -rf
$ ll
总用量 0

例5. 与find命令结合

  xargs命令和find命令算是一对死党,两者结合使用能让很多任务变得更轻松高效。本例将演示如何删除某个文件夹下的pycache文件夹。
  演示命令如下:

$ tree
.
├── app
│   ├── app.py
│   └── __pycache__
│       └── __init__.py
├── config
│   └── __pycache__
└── __pycache__

$ find . -name "__pycache__" -type d -print0 | xargs -p -0 rm -rf 
rm -rf ./__pycache__ ./config/__pycache__ ./app/__pycache__ ?...y
$ tree
.
├── app
│   └── app.py
└── config

参考文献

  1. Linux Shell Scripting Cookbook(Second Edition): Shantanu Tushar, Sarath Lakshman

  2. 如何在Linux上使用xargs命令: https://mp.weixin.qq.com/s/eP6QX1Gwr_MorYHqW_qbrQ

  3. Linux 系統 xargs 指令範例與教學: https://blog.gtwang.org/linux/xargs-command-examples-in-linux-unix/

    

     注意,活动截止时间为2021年3月10日晚10点。届时请大家关注中奖消息!

    

浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报