zoukankan      html  css  js  c++  java
  • 转 linux下xargs命令用法详解

    xargs在linux中是个很有用的命令,它经常和其他命令组合起来使用,非常的灵活.
    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.由此 这个命令也是后置引用的一个强有力的替换.在一般使用过多参数的命令替换失败的时候,用xargs来替换它一般都能成功.通常情况下,xargs从管道或 者stdin中读取数据,但是它也能够从文件的输出中读取数据.
    xargs的默认命令是echo.这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代.如:
    bash$ ls -l
    total 0
    -rwxr-xr-x 2 root root 4096 2009-02-23 090218.txt
    -rwxr-xr-x 2 root root 12288 2009-06-08 090607.txt
    bash$ ls -l | xargs
    090218.txt 090607.txt
    bash$ find ~/mail -type f | xargs grep "Linux"
    ./misc:User-Agent: slrn/0.9.8.1 (Linux)
    ./sent-mail-jul-2005: hosted by the Linux Documentation Project.
    ./sent-mail-jul-2005: (Linux Documentation Project Site, rtf version)
    ./sent-mail-jul-2005: Subject: Criticism of Bozo's Windows/Linux article
    . . .
    ls | xargs -p -l gzip 使用gzips压缩当前目录下的每个文件,一次压缩一个, 并且在每次压缩前都提示用户.
    注意: 一个有趣的xargs选项是-n NN,NN是限制每次传递进来参数的个数.
    ls | xargs -n 8 echo以每行8列的形式列出当前目录下的所有文件.
    注意: 另一个有用的选项是-0,使用 find -print0 或 grep -lZ 这两种组合方式. 这允许处理包含空白或引号的参数.
    find / -type f -print0 | xargs -0 grep -liwZ GUI | xargs -0 rm -f
    grep -rliwZ GUI / | xargs -0 rm -f
    上边两行都可以用来删除任何包含"GUI"的文件。
    -i 表示 find 传递给xargs的结果 由{}来代替
    -I 我认为是和i差不多,可以这么认为 -i可以用-I {} 来代替
    -p 交互式提问y来确认命令的每次执行。
    -t 在执行前回显各个command
    还有参数-s 和 -x 具体查手册.

    下面是另一个示例,我们希望计算这些文件中的行数:

    $ file * | grep ASCII | cut -d":" -f1 | xargs wc -l

    47853 alert_DBA102.log

    19 dba102_cjq0_14493.trc

    29053 dba102_mmnl_14497.trc

    154 dba102_reco_14491.trc

    43 dba102_rvwr_14518.trc

    77122 total

    (注:上述任务还可用以下命令完成:) 

    $ wc -l ‘file * | grep ASCII | cut -d":" -f1 | grep ASCII | cut -d":" -f1‘

    该 xargs 版本用于阐释概念。Linux 可以用几种方法来完成同一个任务;请使用最适合您的情况的方法。

    使用该方法,您可以快速重命名目录中的文件。

    $ ls | xargs -t -i mv {} {}.bak

    -i 选项告诉 xargs 用每项的名称替换 {}。-t 选项指示 xargs 先打印命令,然后再执行。

    另一个非常有用的操作是当您使用 vi 打开要编辑的文件时:

    $ file * | grep ASCII | cut -d":" -f1 | xargs vi

    该命令使用 vi 逐个打开文件。当您希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。

    它还有几个选项。最有用的可能是 -p 选项,它使操作具有可交互性:

    $ file * | grep ASCII | cut -d":" -f1 | xargs -p vi

    vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc

    dba102_reco_14491.trc dba102_rvwr_14518.trc ?...

    此处的 xarg 要求您在运行每个命令之前进行确认。如果您按下 "y",则执行命令。当您对文件进行某些可能有破坏且不可恢复的操作(如删除或覆盖)时,您会发现该选项非常有用。

    -t 选项使用一个详细模式;它显示要运行的命令,是调试过程中一个非常有帮助的选项。 

    如果传递给 xargs 的输出为空怎么办?考虑以下命令:

    $ file * | grep SSSSSS | cut -d":" -f1 | xargs -t wc -l wc -l 0 $

    在此处,搜索 "SSSSSS" 后没有匹配的内容;因此 xargs 的输入均为空,如第二行所示(由于我们使用 -t 这个详细选项而产生的结果)。虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,您可能希望停止 xargs;如果是这样,可以使用 -r 选项:

    $ file * | grep SSSSSS | cut -d":" -f1 | xargs -t -r wc -l $

    如果没有要运行的内容,该命令退出。

    假设您希望使用 rm 命令(该命令将作为 xargs 命令的参数)删除文件。然而,rm 只能接受有限数量的参数。如果您的参数列表超出该限制怎么办?xargs 的 -n 选项限制单个命令行的参数个数。 

    下面显示了如何限制每个命令行仅使用两个参数:即使向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。

    $ file * | grep ASCII | cut -d":" -f1 | xargs -t -n2 ls -ltr

    ls -ltr alert_DBA102.log dba102_cjq0_14493.trc

    -rw-r----- 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc

    -rw-r--r-- 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log

    ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc

    -rw-r----- 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc

    -rw-r----- 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc

    ls -ltr dba102_rvwr_14518.trc

    -rw-r----- 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

    使用该方法,您可以快速重命名目录中的文件。

    find . -name backup_view.sh | xargs -t -i chmod 777 {} 

    find . -name '*.sh' | xargs -t -i chmod 777 {} 

    args的-i参数

    args与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如
     # find . -type f -name "*.log" | xargs rm -rf *
    就将以log结尾的文件删除了,如果我想去移动或者复制就需要使用参数来代替了。
     
    xargs  -i 参数或者-I参数配合{}即可进行文件的操作。
     
    -I replace-str
                  Replace  occurrences  of  replace-str  in the initial-arguments with names read from standard input.  Also, unquoted blanks do not terminate
                  input items; instead the separator is the newline character.  Implies -x and -L 1.

           --replace[=replace-str], -i[replace-str]
                  This option is a synonym for -Ireplace-str if replace-str is specified, and for -I{} otherwise.  This option is deprecated; use -I  instead.
    man了一下看的还是不太懂,通过例子,做作实验将我的理解写一下。
     
    ############### 操作的目录下的文件###############
    [root@test05 ab]# ls
    1kk.zip  3kk.zip  5kk.zip  b.rar  d.rar  f.rar  h.rar  j.rar  mini.txt  ni.txt
    2kk.zip  4kk.zip  a.rar    c.rar  e.rar  g.rar  i.rar  k.rar  nii.txt
    ###################使用 i 参数 ##################
    [root@test05 ab]# find . -type f -name "*.txt" | xargs -i cp {}  /tmp/k/
    [root@test05 ab]# ls ../k/
    mini.txt  nii.txt  ni.txt
    [root@test05 ab]#
    ###################  使用 I  参数 ################
    [root@test05 ab]# find . -type f -name "*.txt" | xargs -I {} cp {}  /tmp/n/
    [root@test05 ab]# ls ../n/
    mini.txt  nii.txt  ni.txt
     
    结果出来了,
      加-i 参数直接用 {}就能代替管道之前的标准输出的内容;

     加 -I 参数 需要事先指定替换字符

     ###for linux

    find . -name * | xargs tar  -cvrf /tmp/dba.tar

    gzip /tmp/dba*.tar

    ###for aix:

    setting 1:

    tar -cvf - a* |compress > ../a.Z

    or
    tar -cvf - dba |gzip > dba.tar.gz


    ##解压缩
    step:
    gunzip dba.tar.gz
    tar xvf dba.tar

    or

    for aix:

    setting 1:

    tar -cvf - a* |compress > ../a.Z

    or
    tar -cvf - dba |gzip > dba.tar.gz


    ##解压缩
    step:
    gunzip dba.tar.gz
    tar xvf dba.tar

    拆包方法: gzip -d <dba.tar.gz | tar xvf -


    ###查看方法

    查看方法: gzip -d <dba.tar.gz | tar tvf - | more

    ref

    https://www.ibm.com/developerworks/cn/aix/library/1012_yujing_aixcompress/

    http://blog.51cto.com/liuleideshitou/726670

  • 相关阅读:
    js 去除金额的千位分隔符
    vue中的iviewUI导出1W条列表数据每次只导出2000条的逻辑
    js取整数、取余数的方法
    http协议
    vue 项目安装sass的依赖包
    浅析vue的双向数据绑定
    闭包
    Top 20 NuGet packages for captcha
    IIS URL Rewrite Module的防盗链规则设置
    IIS URL Rewrite – Installation and Use
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/6180056.html
Copyright © 2011-2022 走看看