当前位置:
首页 >
xargs的简单解析
发布时间:2025/3/20
43
豆豆
生活随笔
收集整理的这篇文章主要介绍了
xargs的简单解析
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
根据《Linux与unix shell编程指南》第2章对xargs解析如下:xargs的作用是用来回避对命令行长度的限制,它通过使用一个参数多次调用一个命令实现这一功能,而不是一次使用多个参数
。这句话的意思是:xargs永远一次只传给他后面的命令一个参数,然后不停的将所有参数一一传完.
其实这个解析我觉得系错的,等阵再证明“
==============分割线=============
一个简单的应用如下:bash-3.00$ lsa.log a.txt b.log b.txt c.log c.txtbash-3.00$ ls | xargs rm ---------(删除全部文件)bash-3.00$ lsbash-3.00$
上面第3行命令意思就是把ls得到的结果 输出给 后面的命令rm,作为rm的参数.
也就是说,上面的命令执行相当于:rm a.log a.txt b.log b.txt c.log c.txt
==============分割线=============下面证明这句话是错的:xargs永远一次只传给他后面的命令一个参数,然后不停的将所有参数一一传完
看如下例子bash-3.00$ ls -ltotal 2-rw-r--r-- 1 o475110 u_gtsusr 0 Nov 23 11:10 a-rw-r--r-- 1 o475110 u_gtsusr 0 Nov 23 11:11 bdrwxr-xr-x 2 o475110 u_gtsusr 512 Nov 23 11:11 c_folder (当前目录下有a b两个文件,和c_folder 这个文件夹)bash-3.00$ ls -l c_folder/total 0 (c_folder 文件夹是空的) bash-3.00$ ls a b c_folder (ls出来的输出)bash-3.00$ ls |xargs cp (执行命令)bash-3.00$ ls a b c_folder (当前目录没变化)bash-3.00$ ls c_folder/ (把a 和 b copy到了c_folder下)a bbash-3.00$
可以看出:ls |xargs cp 这个命令 相当于执行了 cp a b c_folder (把 a b copy 到c_folder),而不是把 a b c_folder这3个参数一次一次地传给cp而是把ls的输出 一次过交给xargs后面的命令cp,作为cp的参数。
==============分割线=============那么如何将参数1个1个地传给xargs 后面的命令呢
起始xargs 有1个参数-n-n number Invokes utility using as many standard inputarguments as possible, up to number (a posi-tive decimal integer) arguments maximum.Fewer arguments will be used if:
o The command line length accumulatedexceeds the size specified by the -soption (or {LINE_MAX} if there is no -soption), or
o The last iteration has fewer thannumber, but not zero, operands remain-ing.
能指定每一次指定多少个参数给xargs后面的命令:
例子:bash-3.00$ ls #当前目录下有a b c d 4个文件夹 a b c dbash-3.00$ ls | xargs echo #默认不带参数的话, 管线前面的参数是一次过传给echo的a b c dbash-3.00$ ls | xargs -n 1 echo #这次逐个传给echo了。 所以echo 了4次, 有4行abcdbash-3.00$ ls | xargs -n 2 echo #每次传2个参数给echo , echo 了 2次。a bc dbash-3.00$
==============分割线=============这里介绍另1个很有用的参数i-i[replstr] This option is equivalent to -I replstr. Thestring {} is assumed for replstr if theoption-argument is omitted
意思是 xargs 加上 -i 参数后, 能用{} 代表管线前面的输出。接上面的例子:例如我想cp a b c d 到另1个文件夹../e
如果用ls | xargs cp -r ../e 是不行的因为相当于执行了 cp -r ../e a b c d ... #吧 ../e a b c 这个4个文件copy 到 d
用 ls | xargs -i cp {} ../e 就ok了因为{} 就代表了前面ls的输出, 就是a b c d 了啊~
。这句话的意思是:xargs永远一次只传给他后面的命令一个参数,然后不停的将所有参数一一传完.
其实这个解析我觉得系错的,等阵再证明“
==============分割线=============
一个简单的应用如下:bash-3.00$ lsa.log a.txt b.log b.txt c.log c.txtbash-3.00$ ls | xargs rm ---------(删除全部文件)bash-3.00$ lsbash-3.00$
可以睇出xargs的功能:它将输入 输出给xargs后面的命令,作为那个命令的参数。
上面第3行命令意思就是把ls得到的结果 输出给 后面的命令rm,作为rm的参数.
也就是说,上面的命令执行相当于:rm a.log a.txt b.log b.txt c.log c.txt
==============分割线=============下面证明这句话是错的:xargs永远一次只传给他后面的命令一个参数,然后不停的将所有参数一一传完
看如下例子bash-3.00$ ls -ltotal 2-rw-r--r-- 1 o475110 u_gtsusr 0 Nov 23 11:10 a-rw-r--r-- 1 o475110 u_gtsusr 0 Nov 23 11:11 bdrwxr-xr-x 2 o475110 u_gtsusr 512 Nov 23 11:11 c_folder (当前目录下有a b两个文件,和c_folder 这个文件夹)bash-3.00$ ls -l c_folder/total 0 (c_folder 文件夹是空的) bash-3.00$ ls a b c_folder (ls出来的输出)bash-3.00$ ls |xargs cp (执行命令)bash-3.00$ ls a b c_folder (当前目录没变化)bash-3.00$ ls c_folder/ (把a 和 b copy到了c_folder下)a bbash-3.00$
可以看出:ls |xargs cp 这个命令 相当于执行了 cp a b c_folder (把 a b copy 到c_folder),而不是把 a b c_folder这3个参数一次一次地传给cp而是把ls的输出 一次过交给xargs后面的命令cp,作为cp的参数。
==============分割线=============那么如何将参数1个1个地传给xargs 后面的命令呢
起始xargs 有1个参数-n-n number Invokes utility using as many standard inputarguments as possible, up to number (a posi-tive decimal integer) arguments maximum.Fewer arguments will be used if:
o The command line length accumulatedexceeds the size specified by the -soption (or {LINE_MAX} if there is no -soption), or
o The last iteration has fewer thannumber, but not zero, operands remain-ing.
能指定每一次指定多少个参数给xargs后面的命令:
例子:bash-3.00$ ls #当前目录下有a b c d 4个文件夹 a b c dbash-3.00$ ls | xargs echo #默认不带参数的话, 管线前面的参数是一次过传给echo的a b c dbash-3.00$ ls | xargs -n 1 echo #这次逐个传给echo了。 所以echo 了4次, 有4行abcdbash-3.00$ ls | xargs -n 2 echo #每次传2个参数给echo , echo 了 2次。a bc dbash-3.00$
==============分割线=============这里介绍另1个很有用的参数i-i[replstr] This option is equivalent to -I replstr. Thestring {} is assumed for replstr if theoption-argument is omitted
意思是 xargs 加上 -i 参数后, 能用{} 代表管线前面的输出。接上面的例子:例如我想cp a b c d 到另1个文件夹../e
如果用ls | xargs cp -r ../e 是不行的因为相当于执行了 cp -r ../e a b c d ... #吧 ../e a b c 这个4个文件copy 到 d
用 ls | xargs -i cp {} ../e 就ok了因为{} 就代表了前面ls的输出, 就是a b c d 了啊~
总结
以上是生活随笔为你收集整理的xargs的简单解析的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 一些常见的Find 命令
- 下一篇: [转]Vi 教程(Unix行编辑器)