美文网首页生物信息-生物统计
Linux中xargs命令的使用方法

Linux中xargs命令的使用方法

作者: 育种数据分析之放飞自我 | 来源:发表于2019-05-08 19:39 被阅读4次

    1. 背景

    xargs可以高效对文件批量处理:

    • 比如你要在不同的文件夹下创建同一个文件
    • 比如你想根据某个查询条件, 批量删除符合条件的文件
    • 比如你想对不同文件夹中的文件进行更新

    笨笨的方法, 是一个一个的进行复制, 比如cd xxx;ls;cp xxx yyy; cd ../; 其实, xargs可以非常优雅的进行批量的操作. 下面用几个例子, 演示一下xargs的用法. 一个坑就是使用echo和ls的问题, 这里进行了测试.

    2. 创建文件

    创建6个文件夹y1 ~ y6, 创建一个文件: hello_world.txt

    (base) [dengfei@localhost xargs]$ mkdir y1 y2 y3 y4 y5 y6
    (base) [dengfei@localhost xargs]$ cat >hello_world.txt
    hello world
    我是邓飞
    公众号为:育种数据分析之放飞自我
    没错, 这样打广告是最棒的
    

    使用tree查看目录结构:

    (base) [dengfei@localhost xargs]$ tree
    .
    ├── hello_world.txt
    ├── y1
    ├── y2
    ├── y3
    ├── y4
    ├── y5
    └── y6
    
    6 directories, 1 file
    

    3. 将hello_world.txt批量copy到六个文件夹中

    命令:

    • 这里使用ls -d仅仅打印文件夹名称, 而不打印文件夹里面的内容
    • xargs -i是定义对象的位置, 匹配的是{}, 它会将前面的对象, 放到{}的位置
    ls -d y*|xargs -i cp hello_world.txt {}
    

    效果:

    (base) [dengfei@localhost xargs]$ tree
    .
    ├── hello_world.txt
    ├── y1
    │   └── hello_world.txt
    ├── y2
    │   └── hello_world.txt
    ├── y3
    │   └── hello_world.txt
    ├── y4
    │   └── hello_world.txt
    ├── y5
    │   └── hello_world.txt
    └── y6
        └── hello_world.txt
    
    6 directories, 7 files
    
    

    搞定
    **坑1: **
    使用ls y*, 而不是ls -d y*, 达不到理想的效果:

    (base) [dengfei@localhost xargs]$ tree
    .
    ├── hello_world.txt
    ├── y1
    ├── y1:
    ├── y2
    ├── y2:
    ├── y3
    ├── y3:
    ├── y4
    ├── y4:
    ├── y5
    ├── y5:
    ├── y6
    └── y6:
    
    6 directories, 7 files
    (base) [dengfei@localhost xargs]$ ls
    hello_world.txt  y1  y1:  y2  y2:  y3  y3:  y4  y4:  y5  y5:  y6  y6:
    
    

    这是因为:

    (base) [dengfei@localhost xargs]$ ls y* |xargs 
    y1: y2: y3: y4: y5: y6:
    
    

    坑2:
    echo比ls要好, 比如:

    (base) [dengfei@localhost xargs]$ echo y* |xargs 
    y1 y2 y3 y4 y5 y6
    
    

    显示没问题, 但是用到xargs中报错, 因为echo会打印的是字符串.

    (base) [dengfei@localhost xargs]$ echo y* |xargs -i cp hello_world.txt {}
    (base) [dengfei@localhost xargs]$ tree
    .
    ├── hello_world.txt
    ├── y1
    ├── y1\ y2\ y3\ y4\ y5\ y6
    ├── y2
    ├── y3
    ├── y4
    ├── y5
    └── y6
    
    6 directories, 2 files
    (base) [dengfei@localhost xargs]$ ls
    hello_world.txt  y1  y1 y2 y3 y4 y5 y6  y2  y3  y4  y5  y6
    
    

    4. 爬坑

    使用两步法, 第一步将echo的对象, 进行分割, 一个对象一行, 使用xargs -n1

    (base) [dengfei@localhost xargs]$ echo y* |xargs -n1
    y1
    y2
    y3
    y4
    y5
    y6
    
    

    然后再用一次xargs -i即可成功.
    完整命令:

    echo y* |xargs -n1|xargs -i cp hello_world.txt {}
    
    

    效果:

    (base) [dengfei@localhost xargs]$ tree
    .
    ├── hello_world.txt
    ├── y1
    │   └── hello_world.txt
    ├── y2
    │   └── hello_world.txt
    ├── y3
    │   └── hello_world.txt
    ├── y4
    │   └── hello_world.txt
    ├── y5
    │   └── hello_world.txt
    └── y6
        └── hello_world.txt
    
    6 directories, 7 files
    
    

    这样就消除了是用echo报错的问题. 而且逻辑更加清楚.

    在这里插入图片描述

    相关文章

      网友评论

        本文标题:Linux中xargs命令的使用方法

        本文链接:https://www.haomeiwen.com/subject/qkovoqtx.html