概述
xargs
命令可以将标准输出转为命令行参数。真正执行的命令,紧跟在 xargs
后面并接受 xargs
传来的参数。
之所以使用该命令,是因为很多命令不支持 |
管道来传递参数,而在实际使用中是有这个需求的,所以需要用到该命令。xargs
命令主要完成:处理管道传输过来的标准输入,然后将处理后的内容传递到正确的位置上。
语法
该命令的语法如下:
xargs [选项] [命令]
该命令支持的选项有:
选项 | 说明 |
---|---|
-0, --null | 项目由一个空值分隔,而不是空格;禁用引号和反斜杠处理和逻辑 EOF 处理 |
-a, --arg-file=FILE | 从 FILE 中读取参数,而不是标准输入 |
-d, --delimiter=CHARACTER | 指定分隔符,不是空格;禁用引号和反斜杠处理和逻辑EOF处理 |
-E END | 设置逻辑EOF字符串;如果 END 作为一行出现输入,其余输入被忽略(如果指定了 -0 或 -d 则忽略) |
-e, --eof[=END] | 如果指定了 END,则等效于 -E END;否则,没有文件结尾字符串 |
-I R | 与 --replace=R 相同 |
-i, --replace[=R] | 将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替 |
-L, --max-lines=MAX-LINES | 从标准输入一次读取 num 行送给 command 命令 |
-l[MAX-LINES] | 类似于 -L |
-n, --max-args=MAX-ARGS | 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的 |
-P, --max-procs=MAX-PROCS | 一次最多运行 MAX-PROCS 进程 |
-p, --interactive | 当每次执行一个 argument 的时候询问一次用户 |
–process-slot-var=VAR | 在子进程中设置环境变量 VAR |
-r, --no-run-if-empty | 如果没有参数,则不运行 COMMAND;如果没有给出这个选项,COMMAND 将是至少运行一次 |
-s, --max-chars=MAX-CHARS | 将命令行的长度限制为 MAX-CHARS |
–show-limits | 显示命令行长度限制 |
-t, --verbose | 表示先打印命令,然后再执行 |
-x, --exit | 如果超出大小(参见 -s)则退出 |
–help | 显示此帮助并退出 |
–version | 输出版本信息并退出 |
使用
默认 echo
xargs
后面跟的默认命令是 echo
,即打印输出。如下:
cat test.txt | xargs
# 等价于
cat test.txt | xargs echo
指定分隔符
默认情况下,xargs
命令以换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。但如果要指定其他字符作为分隔符,可以使用 -d
选项。命令格式如下:
# 语法
输出的命令 | xargs -d 指定分隔符 接受参数的命令
# 示例,以制表符进行分隔
echo -e "a\tb\tc" | xargs -d "\t" echo
# 示例,以字符 "a" 进行分隔
echo -e "abacad" | xargs -d "a" echo
-0
选项
xargs
命令默认是将空格作为分隔符,不适合处理包含空格的文件名。find
命令有一个 -print0
选项,指定输出的文件列表以 ASCII 码 NUL
('\0'
)分隔,而 xargs
命令的 -0
选项表示将 ASCII 码 NUL
('\0'
)作为分隔符。所以它们两个可以一起搭配使用,对一些文件进行操作。
事实上 xargs -0
是特殊的 xargs -d
,等价于 xargs -d "\0"
。xargs -0
一般同 find -print0
配合使用。比如删除所有查询出来的文件:
# 利用 xargs -0 和 find -print0 来完成
find /root/ -type f -name "*.txt" -print0 | xargs -0
指定处理参数个数
可以使用 -n
选项指定每次将多少个参数作为命令行参数。语法如下:
# 语法
输出的命令 | xargs -n 处理的参数个数 接受参数的命令
# 示例
ls /root/ | xargs -n 2 echo
指定处理行个数
如果标准输入中包含多行,可以通过 -L
选项每次指定多少行作为一个命令行参数。语法如下:
# 语法
输出的命令 | xargs -L 处理的行数 接受参数的命令
# 示例,每行运行一次 echo 命令
echo -e "a\nb\nc" | xargs -L 1 echo
注:
-n
选项和-L
选项的区别是:-n
选项默认是按照空格分隔;-L
选项默认是按照行分隔,并且是非空行。
指定参数位置
默认情况下是将分割后处理后的结果整体传递到命令的最尾部,大多数命令的参数都是在命令的最尾部。但有时候需要参数不一定在命令的最尾部,可能在其他位置,所以如果需要将参数传递到其他位置,可以使用 -i
选项,并且以大括号 {}
作为替换符号(也是占位符),传递的时候 {}
会被结果替换。可以将 {}
放在任意需要传递的参数位上,如果多个地方使用 {}
则就实现了多个传递。例如:
# 示例,求 /root/ 目录下所有的普通目录
# -maxdepath 1 表示只统计 /root 目录下,而不涉及其子目录
# -type d 表示指定类型为目录
# grep -v "/\\." 是用来排除隐藏目录的
find /root/ -maxdepth 1 -type d | grep -v "/\\."
# 现在我们要将 "/root/" 作为参数进行传递,我们就可以获取任何目录下的所有一级子目录,通过 `xargs -i` 实现
echo "/root/" | xargs -i find "{}" -maxdepth 1 -type d | grep -v "/\\."
自定义替换符号
xargs -I
(大写字母 i
)和 xargs -i
是一样的,其中 -i
是默认使用大括号 {}
作为替换符号,而 -I
则可以自定义其他符号、字母、数字、字符串作为替换符号,但需要使用引号引起来。通常使用 -i
选项,因为简单,但如果要接收的命令中已经使用了大括号 {}
(如 touch {1..100}.txt
),那么就不能使用 -i
选项了,需要使用 -I
选项。例如:
echo "/root/" | xargs -i find "{}" -maxdepth 1 -type d | grep -v "/\\."
# 用 -I 选项进行替换,自定义替换其他符号,比如 "path"
echo "/root/" | xargs -I "path" find "path" -maxdepth 1 -type d | grep -v "/\\."
# 用 -I 选项进行替换,自定义替换其他符号,比如 "123"
echo "/root/" | xargs -I "123" find "123" -maxdepth 1 -type d | grep -v "/\\."
除此之外,还可以使用 -I
选项将命令行参数传递给多个命令。例如:
# 语法
输出的命令 | xargs -I 自定义替换符号 sh -c 接受参数的多个命令
# 示例,查看指定目录本身的详细信息
echo "/home/ /root" | xargs -I path sh -c 'echo path; ls -lhd path'
询问是否执行
如果在命令执行之前询问用户是否要执行该命令,可以用上 -p
选项。命令个数如下:
# 语法
输出的命令 | xargs -p 接受参数的命令
# 示例
echo "a.txt b.txt c.txt" | xargs -p touch
-t
选项
-t
选项会打印最终要执行的命令,然后直接执行,不需要用户确认。