Linux入门之玩转xargs命令

  本文将介绍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/
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中的find和xargs命令通常一起使用,以便对匹配到的文件进行处理。find命令用于查找文件和目录,而xargs命令用于将find命令获取到的文件批量传递给其他命令进行处理。[1] 通过将find命令的输出传递给xargs命令xargs命令每次只获取一部分文件而不是全部,这样可以分批处理文件,避免因文件过多而导致溢出错误。 这对于那些对能够传递给exec命令的参数长度有限制的系统尤其有用。 使用xargs命令的格式通常为: find <目录> <搜索条件> | xargs <命令> 其中,<目录>指定要搜索的目录,<搜索条件>指定要查找的文件类型、文件名等条件,<命令>是要对匹配到的文件进行的具体操作命令。 通过这种方式,我们可以方便地对匹配到的文件进行批量处理,比如复制、移动、删除等操作。同时,xargs命令还支持将find命令的输出作为命令行参数传递给其他命令,进一步扩展了命令的功能和灵活性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Linux命令-find命令xargs](https://blog.csdn.net/weixin_43727674/article/details/118223282)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [linux find命令xargs简单概述](https://download.csdn.net/download/weixin_38704922/12844570)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值