Linux命令之将标准输入转为命令行参数xargs

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux命令之将标准输入转为命令行参数xargs相关的知识,希望对你有一定的参考价值。

概述

xargs 命令可以将标准输出转为命令行参数。真正执行的命令,紧跟在 xargs 后面并接受 xargs 传来的参数。

之所以使用该命令,是因为很多命令不支持 | 管道来传递参数,而在实际使用中是有这个需求的,所以需要用到该命令。xargs 命令主要完成:处理管道传输过来的标准输入,然后将处理后的内容传递到正确的位置上。



语法

该命令的语法如下:

xargs [选项] [命令]

该命令支持的选项有:

选项说明
-0, --null项目由一个空值分隔,而不是空格;禁用引号和反斜杠处理和逻辑 EOF 处理
-a, --arg-file=FILEFILE 中读取参数,而不是标准输入
-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 选项会打印最终要执行的命令,然后直接执行,不需要用户确认。

以上是关于Linux命令之将标准输入转为命令行参数xargs的主要内容,如果未能解决你的问题,请参考以下文章

Linux常见命令xargs命令

Linux常用命令——xargs

xargs命令详解,xargs与管道的区别

Linux命令学习之xargs命令

linux xargs命令

Linux-xargs命令