Linux中xargs的使用方法

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. 将文件批量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, 比如:

(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报错的问题. 而且逻辑更加清楚.

本文分享自微信公众号 - 育种数据分析之放飞自我(R-breeding),作者:邓飞

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 笔记 | GWAS 操作流程4-2:LM模型+数值协变量

    上一篇,我们介绍了数量性状进行GWAS的一般线性模型分析的方法(笔记 | GWAS 操作流程4:LM模型assoc),这里我们考虑一下数字协变量,然后用R语言进...

    邓飞
  • DMU遗传评估从入门到出家系列

    DMU是一个数量遗传学工具包,主要功能包括估计方差组分和固定效应,预测育种值。DMU的开发历史可以追溯到25年前,大部分功能基于数量遗传学研究的需求而开发。在丹...

    邓飞
  • 将多个性状画一张箱线图上R实战

    邓飞
  • Sort List

    归并排序的链表法 #include<iostream> using namespace std; struct ListNode { int val;...

    用户1624346
  • python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波。我们知道微分运算是求信号的变化率,具有加强高频分量的作用。在空域运算中来说,对图像的锐...

    砸漏
  • 机器人动力学:机械臂正向动力学与逆向动力学

    正向动力学:已知机器人的关节驱动力矩和上一时刻的运动状态(角度和角速度),计算得到机器人下一时刻的运动加速度,再积分得到速度和角度;

    ZC_Robot机器人技术
  • 华侨城、腾讯签署战略合作协议 共建数字文旅新生态

    ? 11月2日,华侨城集团与腾讯公司在深圳华侨城洲际大酒店举行战略合作协议签约仪式。 根据协议,双方将强强联合,构建全面战略伙伴关系,基于各自资源和技术优势,...

    腾讯文旅
  • Thinkphp的Common模块作用

    Common模块和普通模块一样,可以添加控制器、模型和视图,并且支持多层,但不能直接访问,只能继承,其中模型层 可以作为公用模型,在D方法实例化中调用。D...

    公众号php_pachong
  • 搜狐二季度财报发布,视频盈利之日就是二次崛起之时

    张朝阳在年初时曾明确,“2018年搜狐视频通过自制内容模式,将视频预算削减40%;付费收入将在2018年赶上广告收入,同时视频广告也将迎来增长,搜狐视频预计在2...

    罗超频道
  • PostgreSQL的insert解析

    1、首先需要从slot中取出tuple值,HeapTupleTableSlot.tuple

    yzsDBA

扫码关注云+社区

领取腾讯云代金券