Linux 参数代换 命令 xargs
xargs 命令也是管道命令中的一员。xargs命令的功能简单来说就是参数代换。那么什么叫做参数代换,这里首先要了解管道的概念。在 linux管道 命令一节中我们详细介绍了管道命令的概念。这里我们只是简单进行一下说明。首先我们来看一下管道命令的流程图
也就是管道前面的命令的输出作为后面命令的标准输入。既然是标准输入,所以这里就有一个要求是后面的命令可以在标准输入中读取数据。这个条件还是比较苛刻的,在linux中并不是所有的命令都可以在标准输入设备中读取数据的,能读取的命令数量不多,除了在前面介绍的 cut、grep、wc等命令之外,xargs也是一个可以在标准输入中读取数据的命令。xargs 在标准输入中读取出数据,然后将这些数据作为那些不能从标准输入中读取数据的命令的输入。所以xargs命令,说白了,就是用来传递数据的。
下面我们举个简单的例子来看一下 xargs 命令的作用
$ echo php | ls
上面这个例子是想 用 ls 显示 php 目录下的内容,但是很遗憾,ls不是管道命令,不能从标准输入设备上读取数据,所以它不会显示 php 目录下的内容。因为我们当前是在 workspace 目录下面,所以说,上面的命令会显示 workspace 目录下的内容。
但是,如果我们使用 xargs 命令来做一个数据传递,那将会是另一种结果了
$ echo php | xargs ls
在我系统中,php目录下的内容如下(可以列出php目录下的内容了)
xargs命令语法
通过上面例子,可以看出,xargs命令的语法如下
$ xargs [-options] [command]
xargs 后面的默认命令是echo 。
大多数的时候,xargs命令都是和管道一起使用的,不过,它也是可以单独使用的。
输入 xargs 按下回车以后,终端就开始等待用户的输入,并且将用户的输入作为标准输入。我们可以输入任意的内容,然后按下 ctrl+d 结束输入。这是echo命令就会把我们输入的内容显示出来。
$ xargs find -name
*.txt
# 然后按 ctrl+d 结束输入会显示
jiyik.txt
xargs 参数举例说明
从上面我们已经对xargs命令的语法有了简单的了解,并且了解了它的基本使用方式。接下来我们对xargs命令的参数依次进行举例说明
-d 参数与分隔符
默认情况下,xargs是使用空格作为分隔符将标准输入设备中的数据进行分割,并生成一个个命令的参数,例如
$ echo "dir1 dir2 dir3" | xargs mkdir
这样会在当前目录下生成三个文件夹
dir1 dir2 dir3
如果可以自定义分隔符,如下面使用冒号作为分隔符
$ echo "dir1:dir2:dir3" | xargs -d ":" mkdir
同样也会生成三个文件夹 dir1 dir2 和 dir3。如果不使用选项 -d 指定分隔符的话,则只会生成一个文件夹 dir1:dir2:dir3
-p 确认要执行的命令
使用xargs命令之后,由于存在着参数转换的过程,所以要对执行的命令进行确认。
-p 参数就是用来对要执行的命令进行确认的
$ echo "dir1 dir2 dir3" | xargs -p mkdir
执行之后会在终端显示出要执行的命令,然后是让用户确认,输入 y (大小写均可)才会继续执行命令。
-t 显示要执行的命令
-t 选项是用来显示要执行的命令的,和-p选项不同的是,它不需要用户进行确认
$ echo "dir1 dir2 dir3" | xargs -t mkdir
会直接显示
mkdir dir1 dir2 dir3
-L 指定行数
如果标准输入中包含多行内容,那么 -L 就可以指定多少行来作为下一个命令的参数,例如下面的示例
$ xargs find -name
*.txt
*.md
find: 路径必须在表达式之前: *.md
上面的命令同时将两行的数据作为 find的参数导致报错。
所以这种情况我们就可以使用 -L 选项来指定每一行作为一个参数,这样就不会报错了
$ xargs -L 1 find -name
*txt
jiyik.txt
*md
jiyik.md
-0 与find命令
由于xargs默认将空格作为分隔符,所以不太适合处理文件名,因为文件名可能包含空格。
find命令 有一个特别的参数 -print0,指定输出的文件列表以null分隔。然后,xargs命令的-0参数表示用null当作分隔符。
$ find /path -type f -print0 | xargs -0 rm
上面命令删除/path路径下的所有文件。由于分隔符是null,所以处理包含空格的文件名,也不会报错。
还有一个原因,使得xargs特别适合find命令。有些命令(比如rm)一旦参数过多会报"参数列表过长"的错误,从而而无法执行,改用xargs就没有这个问题,因为它可以对每个参数执行一次命令。
$ find . -name "*.txt" | xargs grep "abc"
上面命令找出所有 TXT 文件以后,对每个文件搜索一次是否包含字符串abc。
-n 指定多少项
-L参数虽然解决了多行的问题,但是有时用户会在同一行输入多项。
$ xargs find -name
"*.txt" "*.md"
find: 路径必须在表达式之前: *.md
上面的命令将同一行的两项作为命令行参数,导致报错。
-n参数指定每次将多少项,作为命令行参数。
$ xargs -n 1 find -name
上面命令指定将每一项(-n 1)标准输入作为命令行参数,分别执行一次命令(find -name)。
-I 选项
如果xargs要将命令行参数传给多个命令,可以使用-I参数。
-I 指定每一项命令行参数的替代字符串。
$ cat jiyik.txt
jiyik_one
jiyik_two
jiyik_three
$ cat jiyik.txt | xargs -I file sh -c 'echo file; mkdir file'
jiyik_one
jiyik_two
jiyik_three
查看当前目录下已经生成了三个目录
$ ls
jiyik_one jiyik_three jiyik_two
上面代码中,jiyik.txt是一个包含三行的文本文件。我们希望对每一项命令行参数,执行两个命令(echo和mkdir),使用-I file表示file是命令行参数的替代字符串。执行命令时,具体的参数会替代掉echo file; mkdir file里面的两个file。
--max-procs 参数
xargs默认只用一个进程执行命令。如果命令要执行多次,必须等上一次执行完,才能执行下一次。
--max-procs参数指定同时用多少个进程并行执行命令。--max-procs 2表示同时最多使用两个进程,--max-procs 0表示不限制进程数。
$ docker ps -q | xargs -n 1 --max-procs 0 docker kill
上面命令表示,同时关闭尽可能多的 Docker 容器,这样运行速度会快很多。
Linux 参数代换 命令 xargs的更多相关文章
- 【Linux】参数代换命令xargs
xargs 是在做什么的呢?就以字面上的意义来看,x 是加减乘除的乘号,args 则是 arguments (参数) 的意思,所以说,这个玩意儿就是在产生某个命令的参数的意思! xargs 可以读入 ...
- linux每天一小步---xargs命令详解
1 命令功能 xargs用来从标准输入中执行命令行 xargs命令用来将一些不支持管道传递参数的命令而使之支持 2 命令语法 xargs [选项参数] commands 3 命令参数 -O 当标准输 ...
- Linux文件查找命令find,xargs详述【转】
转自:http://blog.csdn.net/cxylaf/article/details/4069595 转自http://www.linuxsir.org/main/?q=node/137 Li ...
- linux中touch命令参数修改文件的时间戳(转)
linux中touch命令参数不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件,以下是linux中touch命令参数的使用方法: touch [-acm][-r ...
- linux useradd(adduser)命令参数及用法详解(linux创建新用户命令)
linux useradd(adduser)命令参数及用法详解(linux创建新用户命令) useradd可用来建立用户帐号.帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号 ...
- linux中exec和xargs命令的区别和优劣分析
find的exec及ok命令 exec命令的格式为: exec command {} \; exec后面跟着的是操作命令,然后跟着{}表示每一个参数,然后空格,然后"\;".{}之 ...
- Linux命令-xargs
比如一个例子 echo "README.md" |cat echo "README.md" |xargs cat 第一个例子只是输出了README.md的文件名 ...
- Linux su命令参数及用法详解--Linux切换用户命令
建议大家切换用户的时候 使用 su - root 这样,否则可能发现某些命令执行不了 关于su .su - 及 sudo的区别 请往下看 1.命令作用 su的作用是变更为其它使用者的身份,超级用 ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
随机推荐
- 基于openeuler的openssl编程
------------恢复内容开始------------ 一.编译环境 我下载好之后默认安装了openssl,若未安装的可输入以下命令: wget https://www.openssl.org/ ...
- 云主机新增swap分区
云主机内存不够用,如何新增swap 分区. 如何启用swap分区? 步骤如下: 1.查看当前系统中是否已经启用swap分区 1 2 cat /proc/swaps top 2.如果没有启用swa ...
- 你说说RPC的一个请求的流程是怎么样的?
前言 面试的时候经常被问到RPC相关的问题,例如:你说说RPC实现原理.让你实现一个RPC框架应该考虑哪些地方.RPC框架基础上发起一个请求是怎样一个流程等等.所以这次我就总结一波RPC的相关知识点, ...
- python基础数据类型语法
#标识符:我们自己在写代码的时候,取的名字.#项目名 project name#包名 package name#模块名 .py ptthon文件名#规范:由字母数字下划线组成,但不能以数字#简明知意: ...
- 2021.11.4测试T1-妹子
题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...
- python3+Robotframework+ride+Selenium2Library+Autoitlibrary环境搭建
1.安装python3.8 第一步是安装Python:https://www.python.org/,RF框架是基于python 的,所以一定要有python环境.将python-3.8.2-amd6 ...
- oracle 使用union提示ORA-00907:缺少右括号
在使用union的时候提示:ORA-00907:缺少右括号 此原因是因为在union的左边和右边都有order by,因此需要去掉一边的order by,保留一个即可. 例如: select * fr ...
- 详解电子表格中的json数据:序列化与反序列化
从XML到JSON 当下应用开发常见的B/S架构之下,我们会遇到很多需要进行前后端数据传输的场景.而在这个传输的过程中,数据通过何种格式传输.方式是否迅速便捷.书写方式是否简单易学,都成为了程序员在开 ...
- [tc14634]ExtremeSpanningTrees
保序回归论文题 要求某一个边集为原图的最小生成树,这等价于非树边比所在环(指树上)的所有边小,最大生成树类似 将这些大小关系的限制看作一张有向图,即若要求$w_{i}\le w_{j}$则连边$(i, ...
- 部署vue项目到Linux服务器
案例一 vue-cli构建vue3项目,将项目上传到Linux服务器,服务器安装node,并启动vue项目 首先本地有一个vue项目,启动后可正常访问 本地打包后,也可直接访问 若打包后的index. ...