⚡ Linux xargs 命令参数详解
📖 1. xargs 简介
xargs
是 Linux/Unix 下的一个非常常用的命令工具,作用是 将标准输入(stdin)的数据转换为命令的参数,从而实现批量执行命令的功能。
🚀 2. xargs 用法
🔹 2.1 基础用法
[前置命令] | xargs [选项参数] [后置命令]
此时 xargs
会将 前置命令的标准输出 作为输入,从中读取数据,然后拼接到后置命令中并执行。
⚠️ 注意:如果前置命令没有输出到标准输出(例如使用
-fprintf
将结果直接写入文件),则xargs
将无法获取输入,后置命令也就不会被执行。
📂 2.2 配置文件用法
xargs -a [配置文件] [选项参数] [后置命令]
此时 xargs
会直接从 指定文件 中读取内容作为输入,然后拼接到后置命令中并执行。
⌨️ 2.3 用户交互用法
xargs [后置命令]
如果 xargs
前面没有任何输入,它会直接从 终端标准输入 中读取数据。输入一行内容并按下回车,该行就会作为参数传递给后置命令。当用户按下 Ctrl+D(表示 EOF,文件结束符)时,xargs
才会退出。
⚙️ 3. xargs 参数
🔸 3.1 输入控制型参数
-
-0
:输入项以\0
分隔,常与find -print0
搭配使用
解释:这里利用find将当前目录下的 .txt 文件都找出来,传给 xargs ,再让 xargs 传给 tar 打包
-
-E eofstr
:指定 EOF 标记,遇到该标记时停止读取,通常用来避免处理文件末尾的多余内容,效果:
解释:这里用 STOP 作为 eofstr 分隔符,当 xargs 读取到 STOP 以后就不读取后面的内容,所以 echo 只打印到 STOP 前一行。说实话,我觉得这个参数真的没什么屌用,而且容易出现各种匪夷所思的奇怪现象,似乎 STOP 必须单独成行才能够识别,前后有东西都会识别不成功,知道这是为什么的可以评论区留言。
-
-a file
:从指定文件读取输入,而不是从 stdin 或管道。效果:
解释:这里将 1.txt 作为 file ,将 1.txt 的内容作为参数传递给 echo 打印到终端
-
-d delim
:自定义分隔符(如, : ?
等),一般配合-a file
和配置文件使用,
解释:这里利用 : 作为 delim 分割符将文件的内容分割成多个参数传递给 printf 打印到终端。这里不用 echo 打印是因为 echo 会默认把多个参数用空格连起来,这样看上去就像把 : 替换成空格一样,容易使人感到困惑。
⚠️注意:分割符最好加上引号,防止一些特殊字符被shell提前解析导致命令出错
🧩 3.2 命令结构控制型参数
-
-I {}
:指定占位符。每次读取一行输入,替换命令中出现的占位符位置,效果:
解释:这里利用 -I {} 参数,将当前目录下(包括子目录下)所有的 .txt 后缀的文件名都写入了 5.txt 这个文件中。一般一条 xargs 命令中 {} 会出现两次,第一次在 -I 后面,第二次在后置命令中的任意位置。
⚠️注意:-I {} 参数默认和执行控制型参数中的 -n 和 -L 冲突,同时使用 xargs 会报错。不过 -n 和 -L 一般使用频率较低,所以遇到冲突的情况也较少,可以忽略。
⚡ 3.3 执行控制型参数
-
-n args
:每次最多使用多少个参数,效果:
解释:这里将 2 作为 args ,加了 -n 2 后 echo 一次性只处理2个参数了
-
-L lines
:每次最多读取多少行,效果:
解释:这里将 2 作为 lines ,加了 -L 2 参数以后,echo 一次性只处理两行内容了
-
-s chars
:设置单条命令的最大长度,在碰到超长文件名或路径的时候,用于修改单条命令最大长度上限,以确保命令能正常执行。一般情况下用不到,这里就不演示了。 -
-x
:若参数过长无法执行,则立即退出,同样也是避免超长命令行错误的,这里就不演示了。 -
-P procs
:并行执行的子进程数,通常配合-n
或-L
使用,效果:
解释:这里将 2 作为 procs,让 xargs 一次性开两个子进程跑后置命令。-P 参数主要用于提升效率,进程越多跑的越快嘛,和 make -j 参数一样的道理。不过需要多进程跑的一般都是非常复杂的任务了,大多数情况下不用 -P 参数也不见得会有多慢。
-
-o
:执行命令后,将标准输入重定向回/dev/tty
(终端),保证命令可以继续交互;常用于vim
、less
等交互式程序,效果:
解释:这里可以看到,如果不添加 -o 参数用 xargs 打开 vim 会出现 Warning, 同时退出 vim 后终端会出现异常,详见 4. 注意事项
-
-p
:每次执行命令前询问用户是否确认,效果:
解释:加了 -p 参数在执行命令前就需要用户输入 y 再按回车来确认,直接按回车是不会确认的。
-
-r
:若输入为空,则不执行命令(默认行为是执行一次空命令),效果:
解释:这里在当前目录下找不到 123.txt,所以一次命令都不执行
-
-t
:执行前打印完整命令,通常用于调试,效果:
解释:这还用解释吗?
⚠️ 4. 注意事项
⚡ 4.1 xargs 打开交互式程序出现 stdin 冲突
利用 xargs 打开交互式程序进行操作,操作完退出后终端出现异常:
异常主要表现为看不到输入的内容,同时显示结果的时候出现错位现象。这是因为 xargs 和 vim 的 stdin 冲突导致的,要恢复终端可以在终端盲打输入 reset 后按回车。要避免这个问题需要在 xargs 打开 vim 时添加 -o 参数 。
📚 5. 参考资料
-
GNU xargs 官方手册 (man7.org)