zoukankan      html  css  js  c++  java
  • xargs与exec详解

    一、场景

    这个命令是错误的

    1
    find ./ -perm +700 |ls -l

    这样才是正确的

    1
    find ./ -perm +700 |xargs ls -l

     二、用法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [root@localhost tmp]# xargs --help
    Usage: xargs [-0prtx] [--interactive] [--null] [-d|--delimiter=delim]
           [-E eof-str] [-e[eof-str]]  [--eof[=eof-str]]
           [-L max-lines] [-l[max-lines]] [--max-lines[=max-lines]]
           [-I replace-str] [-i[replace-str]] [--replace[=replace-str]]
           [-n max-args] [--max-args=max-args]
           [-s max-chars] [--max-chars=max-chars]
           [-P max-procs]  [--max-procs=max-procs] [--show-limits]
           [--verbose] [--exit] [--no-run-if-empty] [--arg-file=file]
           [--version] [--help] [command [initial-arguments]]
     
    Report bugs to <bug-findutils@gnu.org>.

     三、示例

    1、压缩所有的日志文件到每一个文件

    1
    find ./ -type f  -name "*.log" | xargs -i -t  tar -zcvf {}.tar.gz {}

     2、压缩所有的图片文件到一个文件

    1
    find ./ -name *.jpg -type f -print | xargs tar -zcvf images.tar.gz

     3、文件内容替换

    1
    find ./ -maxdepth 2 -name a -print | xargs -t -i sed -i '1 i111' '{}'

     4、权限修改

    1
    find ./ -perm -7 -print | xargs chmod o-w

     5、查看文件类型

    1
    find ./ -type f -print | xargs file

     6、删除多个文件

    1
    find ./ -name "*.log" -print0 | xargs -i -0 rm -f {}

     7、复制多个文件

    1
    2
    find ./ -type f -name "*.txt" | xargs -i cp {}  /tmp/
    find ./ -type f -name "*.txt" | xargs -I {} cp {}  /tmp/

    三、注意事项

    1、加-i 参数直接用 {}就能代替管道之前的标准输出的内容;加 -I 参数 需要事先指定替换字符

    2、cshell和tcshell中,需要将{}用单引号、双引号或反斜杠

    3、如果需要处理特殊字符,需要使用-0参数进行处理

    相比之下,也不难看出各自的缺点
    1、exec 每处理一个文件或者目录,它都需要启动一次命令,效率不好; 
    2、exec 格式麻烦,必须用 {} 做文件的代位符,必须用 ; 作为命令的结束符,书写不便。
    3、xargs 不能操作文件名有空格的文件;

    综上,如果要使用的命令支持一次处理多个文件,并且也知道这些文件里没有带空格的文件,
    那么使用 xargs比较方便; 否则,就要用 exec了。

  • 相关阅读:
    sql-trace-10046-trcsess-and-tkprof
    教你深入理解软件包的配置、编译与安装过程
    Java RESTful 框架的性能比较
    gcc、arm-Linux-gcc和arm-elf-gcc的组成及区别
    Linux线上系统程序debug思路及方法
    使用systemtap调试Linux内核 :www.lenky.info
    SystemTap使用技巧 1
    gvfs
    Systemtap examples, Network
    .NET 大型信息化建设标准基础数据管理平台
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/10168394.html
Copyright © 2011-2022 走看看