Linux常用命令[004]:xargs
应用
作用
-
之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有此需求,所以就有了 xargs 命令。
-
是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
-
可以捕获一个命令的输出,然后传递给另外一个命令。
-
可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
-
可以将单行或多行文本输入转换为其他格式:
-
多行变单行
-
单行变多行
-
-
默认的命令是 echo,这意味着通过管道传递给 xargs 的输入将会包含换行和空白,不过通过 xargs 的处理,换行和空白将被空格取代。
命令格式
bash somecommand |xargs -item command
常用选项
- -n :num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
- -l :num 从标准输入一次读取 num 行送给 command 命令。
- -d :delim 分隔符,默认xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
- -I:将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
示例
1、单行文件,多行输出
#生成一个单行文件
echo {a..z} >letter.txt
cat letter.txt
a b c d e f g h i j k l m n o p q r s t u v w x y z
#以5个为一组输出
cat letter.txt | xargs -n 5
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
z
2、多行文件,单行输出
#接示例1,生成一个多行文件
cat letter.txt | xargs -n 5 > letter_mln.txt
cat letter_mln.txt
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
z
#单行输出
cat letter_mln.txt | xargs
a b c d e f g h i j k l m n o p q r s t u v w x y z
3、自定义一个定界符,并输出
echo 'Linux$Centos7$Xargs' | xargs -d$
4、-d和-n 结合使用,在定义定界符同时做单行的输出(多行也是可以的,视情况而定。)
echo 'Linux$Centos7$Xargs' | xargs -d$ -n1
Linux
Centos7
Xargs
5、 使用 -I 指定一个替换字符串 {},这个字符串在 xargs 扩展时会被替换掉;当 -I 与 xargs 结合使用,每一个参数命令都会被执行一次
seq 5 | xargs -I {} echo number {} is good
number 1 is good
number 2 is good
number 3 is good
number 4 is good
number 5 is good
6、复制所有*.sh文件到 /mnt 目录
ls *.sh | xargs -I {} cp {} /mnt
7、rm删除/mnt/*.sh文件
ls /mnt/*.sh | xargs -I {} rm {}
#当目录文件中存在有"a b/txt"文件被删除时会报错,结合本文“作用”这个标题来理解。
find /data -type f -name "*.txt"
a b.txt
#删除操作,它会将“a b.txt”这一个文件当作两个文件来看,但是在删除的时又找不到此文件,就会有以下显示。
find /data -type f -name "*.txt"|xargs rm
rm: cannot remove ‘/data/a’: No such file or directory
rm: cannot remove ‘b.txt’: No such file or directory
#这时我们需要添加选项来解决此问题,xargs -d 0 将 \0 作为定界符。
find /data -type f -name "*.txt" -print0 | xargs -d 0 rm -f
8、查找*.sh 文件,并且压缩它们:
find /home -type f -name "*.sh" -print |xargs tar -czvf script.tar.gz