Linux常用命令-xargs

命令

xargs

描述

build and execute command lines from standard input
从标准输入依次执行后续命令,默认命令是echo

用法

1
xargs [OPTION]... COMMAND INITIAL-ARGS...

选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Options:
-0 显示为1列,并且避免拆分特殊文件名,如文件名中包含空格时需要加此选项
-a 从文件中读取数据而非标准输入
-d 指定分隔符,但是禁止使用引号''和反斜杠\,默认为空格
-e [END] 指定结束符,如果单独输入END作为一行,将忽略后续的输入内容
-i [R] 用从标准输入读取的名称替换初始参数中的R,如果R未指定,则默认为{}
-l 每次传递的行数,以换行符为分隔符
-n 每次传递的参数个数,以空格为分隔符
-P 每次最多运行几个进程
-p 运行命令前提示,输入输入y才能继续执行
-r 如果没有参数,则不运行命令,如果未给出此选项,则命令将至少运行一次
-s 将命令限制为最多几个字符
-t 命令执行前先显示
-x 如果超出大小则退出,配合-s使用
--process-slot-var=VAR 在子进程中设置环境变量

注意

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
$ touch {a..f}
$ mkdir dir1 dir2
$ ls | xargs
a b c d dir1/ dir2/ e f
$ ls > f
# -a读取文件中的内容
$ xargs -a f
a b c d dir1/ dir2/ e f
# 将文件中的多行转换为一行显示
$ seq 1 5 > line
$ more line
1
2
3
4
5
$ xargs -a line
1 2 3 4 5
# 增加一行单独的END作为结束符
$ more f
a
b
c
d
END
dir1/
dir2/
e
f
# 指定结束符,通常为单独的一行END,也可以指定为其他字符串,如下的单独一行e
$ xargs -af -eEND
a b c d
$ xargs -af -ee
a b c d END dir1/ dir2/

# 创建文件f,文件内容为3行,每行有4列
$ more f
line1 arg1 arg2 arg3
line2 arg1 arg2 arg3
line3 arg1 arg2 arg3
$ xargs -af -l1
line1 arg1 arg2 arg3
line2 arg1 arg2 arg3
line3 arg1 arg2 arg3
$ xargs -af -n1
line1
arg1
arg2
arg3
line2
arg1
arg2
arg3
line3
arg1
arg2
arg3
# -l以换行符为分隔符,则一行显示原来的2行内容
$ xargs -af -l2
line1 arg1 arg2 arg3 line2 arg1 arg2 arg3
line3 arg1 arg2 arg3
# -n以空格为分隔符,则一行显示原来的2个参数
$ xargs -af -n2
line1 arg1
arg2 arg3
line2 arg1
arg2 arg3
line3 arg1
arg2 arg3
$ ls | xargs -l
a
b
c
d
dir1/
dir2/
e
f
$ ls | xargs -l3
a b c
d dir1/ dir2/
e f
# -d指定分隔符
$ echo "a,b,c,d,e,f,1,2,3" > f
$ xargs -a f -d ,
a b c d e f 1 2 3
$ xargs -af -d, -n3
a b c
d e f
1 2 3
# -t每次先显示命令在执行,默认执行echo命令
$ ls | xargs -t -l3
echo a b c
a b c
echo d dir1/ dir2/
d dir1/ dir2/
echo e f
e f

$ touch {a..f}.txt
$ ls
a.txt b.txt c.txt d.txt e.txt f.txt
# -i参数引用,批量重命名*.txt文件后缀增加.bak
$ ls *.txt | xargs -t -i mv {} {}.bak
mv a.txt a.txt.bak
mv b.txt b.txt.bak
mv c.txt c.txt.bak
mv d.txt d.txt.bak
mv e.txt e.txt.bak
mv f.txt f.txt.bak
$ ls
a.txt.bak b.txt.bak c.txt.bak d.txt.bak e.txt.bak f.txt.bak

# 批量复制当前目录下的jpg文件到/data/images
$ ls *.jpg | xargs -n1 -i cp {} /data/images
# find+xargs批量删除文件
$ find . -type f -name "*.log" -print0 | xargs -0 rm -f
# 统计当前目录中jpg文件的个数
$ find . -type f -name "*.jpg" | wc -l
# 查找当前目录下的所有jpg文件并打包
$ find . -type f -name "*.jpg" -print0 | xargs -0 tar -czf images.tar.gz
# 批量下载url
$ cat url-list.txt | xargs wget -cq