xargs 命令教程
转自阮一峰 http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
仅供个人交流学习
xargs
是 Unix 系统的一个很有用的命令,但是常常被忽视,很多人不了解它的用法。
本文介绍如何使用这个命令。
一、标准输入与管道命令
Unix 命令都带有参数,有些命令可以接受"标准输入"(stdin)作为参数。
$ cat /etc/passwd | grep root
上面的代码使用了管道命令(|
)。管道命令的作用,是将左侧命令(cat /etc/passwd
)的标准输出转换为标准输入,提供给右侧命令(grep root
)作为参数。
因为grep
命令可以接受标准输入作为参数,所以上面的代码等同于下面的代码。
$ grep root /etc/passwd
但是,大多数命令都不接受标准输入作为参数,只能直接在命令行输入参数,这导致无法用管道命令传递参数。举例来说,echo
命令就不接受管道传参。
$ echo "hello world" | echo
上面的代码不会有输出。因为管道右侧的echo
不接受管道传来的标准输入作为参数。
二、xargs 命令的作用
xargs
命令的作用,是将标准输入转为命令行参数。
$ echo "hello world" | xargs echo
hello world
上面的代码将管道左侧的标准输入,转为命令行参数hello world
,传给第二个echo
命令。
xargs
命令的格式如下。
$ xargs [-options] [command]
真正执行的命令,紧跟在xargs
后面,接受xargs
传来的参数。
xargs
的作用在于,大多数命令(比如rm
、mkdir
、ls
)与管道一起使用时,都需要xargs
将标准输入转为命令行参数。
$ echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three
。如果不加xargs
就会报错,提示mkdir
缺少操作参数。
三、xargs 的单独使用
xargs
后面的命令默认是echo
。
$ xargs
# 等同于
$ xargs echo
大多数时候,xargs
命令都是跟管道一起使用的。但是,它也可以单独使用。
输入xargs
按下回车以后,命令行就会等待用户输入,作为标准输入。你可以输入任意内容,然后按下Ctrl d
,表示输入结束,这时echo
命令就会把前面的输入打印出来。
$ xargs
hello (Ctrl + d)
hello
再看一个例子。
$ xargs find -name
"*.txt"
./foo.txt
./hello.txt
上面的例子输入xargs find -name
以后,命令行会等待用户输入所要搜索的文件。用户输入"*.txt"
,表示搜索当前目录下的所有 TXT 文件,然后按下Ctrl d
,表示输入结束。这时就相当执行find -name *.txt
。
四、-d 参数与分隔符
默认情况下,xargs
将换行符和空格作为分隔符,把标准输入分解成一个个命令行参数。
$ echo "one two three" | xargs mkdir
上面代码中,mkdir
会新建三个子目录,因为xargs
将one two three
分解成三个命令行参数,执行mkdir one two three
。
-d
参数可以更改分隔符。
$ echo -e "a\tb\tc" | xargs -d "\t" echo
a b c
上面的命令指定制表符\t
作为分隔符,所以a\tb\tc
就转换成了三个命令行参数。echo
命令的-e
参数表示解释转义字符。
五、-p 参数,-t 参数
使用xargs
命令以后,由于存在转换参数过程,有时需要确认一下到底执行的是什么命令。
-p
参数打印出要执行的命令,询问用户是否要执行。
$ echo 'one two three' | xargs -p touch
touch one two three ?...
上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y
以后(大小写皆可),才会真正执行。
-t
参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。
$ echo 'one two three' | xargs -t rm
rm one two three
六、-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
。
七、-L 参数
如果标准输入包含多行,-L
参数指定多少行作为一个命令行参数。
$ xargs find -name
"*.txt"
"*.md"
find: paths must precede expression: `*.md'
上面命令同时将"*.txt"
和*.md
两行作为命令行参数,传给find
命令导致报错。
使用-L
参数,指定每行作为一个命令行参数,就不会报错。
$ xargs -L 1 find -name
"*.txt"
./foo.txt
./hello.txt
"*.md"
./README.md
上面命令指定了每一行(-L 1
)作为命令行参数,分别运行一次命令(find -name
)。
下面是另一个例子。
$ echo -e "a\nb\nc" | xargs -L 1 echo
a
b
c
上面代码指定每行运行一次echo
命令,所以echo
命令执行了三次,输出了三行。
八、-n 参数
-L
参数虽然解决了多行的问题,但是有时用户会在同一行输入多项。
$ xargs find -name
"*.txt" "*.md"
find: paths must precede expression: `*.md'
上面的命令将同一行的两项作为命令行参数,导致报错。
-n
参数指定每次将多少项,作为命令行参数。
$ xargs -n 1 find -name
上面命令指定将每一项(-n 1
)标准输入作为命令行参数,分别执行一次命令(find -name
)。
下面是另一个例子。
$ echo {0..9} | xargs -n 2 echo
0 1
2 3
4 5
6 7
8 9
上面命令指定,每两个参数运行一次echo
命令。所以,10个阿拉伯数字运行了五次echo
命令,输出了五行。
九、-I 参数
如果xargs
要将命令行参数传给多个命令,可以使用-I
参数。
-I
指定每一项命令行参数的替代字符串。
$ cat foo.txt
one
two
three $ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three $ ls
one two three
上面代码中,foo.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 容器,这样运行速度会快很多。
xargs 命令教程的更多相关文章
- 关于 ‘--exec’ 参数( find 命令)及介绍 ‘xargs ’命令区别(新版)
前言: find 命令一直都是系统管理员的常用命令之一, 其参数中 "-exec" 尤其实用.而 "xargs" 命令,针对查询也有属于自己的见解.本文着重讲解 ...
- xargs命令
xargs命令 常用工具命令 xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具.它擅长将标准输入数据转换成命令行参数,xargs能够处理管道或者stdin并将其转换成特定命令 ...
- linux下xargs命令用法详解 【转】
转自:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...
- linux包之findutils之find和xargs命令
解释 [root@localhost ~]# rpm -qa|grep findfindutils-4.4.2-6.el6.x86_64 find 路径 测试 动作 三个步骤的处理过程查找一个或多个目 ...
- linux下xargs命令用法详解
原文:http://blog.chinaunix.net/uid-128922-id-289992.html xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xa ...
- 【转】linux中的cut/tr/join/split/xargs命令
1. cut命令 cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出. 截取的方式有三种:一是按照字符位置,二是按照字节位置,三是使用一个分隔符将一行分割成多个field, ...
- Make 命令教程 -- 阮一峰
摘自http://www.ruanyifeng.com/blog/2015/02/make.html Make 命令教程 作者: 阮一峰 日期: 2015年2月20日 代码变成可执行文件,叫做编译(c ...
- linux shell脚本学习xargs命令使用详解
作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题 xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处 ...
- 转 linux下xargs命令用法详解
xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活. xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤 ...
随机推荐
- 一,python编程100例
1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? number = (1 ,2,3,4) ...
- Java自学-类和对象 包
Java中的 包 包: package 把比较接近的类,规划在同一个包下 步骤 1 : 把比较接近的类,规划在同一个包下 Hero,ADHero 规划在一个包,叫做charactor(角色) Item ...
- 基于elementUI创建的vue项目
这周对公司的内容使用vue进行重构,所以记录一下开始项目的过程 下载elementUI: 项目文件夹中在命令行中输入:npm install elementui -s 下载完成后在 main.js 中 ...
- Asp.Net Core 生成二维码(NuGet使用QRCoder)
前言 功能:调用web api 接口 1.获取 jpeg 格式的二维码 2.获取中间带有logo 的二维码 3. 下载 jpeg,svg 格式的二维码 需要的NuGet 包: > QRCoder ...
- Django 配置mysql遇到问题(一)
问题一: django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have ...
- centos7搭建lnmp
一.准备 1. 修改网络yum源 先将系统自带的yum配置文件重命名或删除,然后下载下面两个文件 阿里云:http://mirrors.aliyun.com/repo/Centos-7.repo ep ...
- The 2019 Asia Yinchuan First Round Online Programming F. Moving On
t题目链接:https://nanti.jisuanke.com/t/41290 思路:题目意思很容易想到floyd,但是由于危险度的限制,我们该怎么跑floyd呢. 一开始理解错题目了,以为u-&g ...
- Nikto 扫描工具
一.渗透步骤 信息收集 (被动的信息收集,主动的信息收集) 扫描探测 制定攻击方向 渗透 留后门 课堂分享: 书籍: <使用kali Linux进行web渗透测试>--书中部分工具已经无法 ...
- 在kubernetes集群中部署ElasticSearch集群--ECK
Elastic Cloud on Kubernetes (ECK) ---ECK是这个说法哈. 基本于k8s operator的官方实现. URL: https://www.elastic.co/gu ...
- NameValueCollectionValueProvider
NameValueCollectionValueProvider provider = new NameValueCollectionValueProvider(nameValueCollection ...