注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

饥民2011

一直在搬砖

 
 
 

日志

 
 
 
 

xargs的简单解析  

2011-11-23 11:24:32|  分类: Shell |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
根据《Linux与unix shell编程指南》第2章
对xargs解析如下:
xargs的作用是用来回避对命令行长度的限制,它通过使用一个参数多次调用一个命令实现这一功能,而不是一次使用多个参数
。这句话的意思是:xargs永远一次只传给他后面的命令一个参数,然后不停的将所有参数一一传完.

其实这个解析我觉得系错的,等阵再证明“


==============分割线=============

一个简单的应用如下:
bash-3.00$ ls
a.log  a.txt  b.log  b.txt  c.log  c.txt
bash-3.00$ ls | xargs rm                                                         ---------(删除全部文件)
bash-3.00$ ls
bash-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 -l
total 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 b
drwxr-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  b
bash-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 input
                     arguments as possible, up to number (a posi-
                     tive  decimal  integer)  arguments  maximum.
                     Fewer arguments will be used if:

                       o  The  command  line  length  accumulated
                          exceeds  the  size  specified by the -s
                          option (or {LINE_MAX} if there is no -s
                          option), or

                       o  The  last  iteration  has  fewer   than
                          number,  but not zero, operands remain-
                          ing.

能指定每一次指定多少个参数给xargs后面的命令:


例子:
bash-3.00$ ls                                                                #当前目录下有a b c d 4个文件夹                                               
a  b  c  d
bash-3.00$ ls | xargs echo                                           #默认不带参数的话, 管线前面的参数是一次过传给echo的
a b c d
bash-3.00$ ls | xargs -n 1 echo                                    #这次逐个传给echo了。 所以echo 了4次, 有4行
a
b
c
d
bash-3.00$ ls | xargs -n 2 echo                                    #每次传2个参数给echo , echo 了 2次。
a b
c d
bash-3.00$ 


==============分割线=============
这里介绍另1个很有用的参数i
-i[replstr]     This option is equivalent to -I replstr. The
                     string  {}  is  assumed  for  replstr if the
                     option-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 了啊~
  评论这张
 
阅读(148)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018