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
参考文献
Linux Shell Scripting Cookbook(Second Edition): Shantanu Tushar, Sarath Lakshman
如何在Linux上使用xargs命令: https://mp.weixin.qq.com/s/eP6QX1Gwr_MorYHqW_qbrQ
Linux 系統 xargs 指令範例與教學: https://blog.gtwang.org/linux/xargs-command-examples-in-linux-unix/
注意,活动截止时间为2021年3月10日晚10点。届时请大家关注中奖消息!