||
xargs可以高效对文件批量处理:
笨笨的方法, 是一个一个的进行复制, 比如
cd xxx
;ls
;cp xxx yyy
;cd ../
; 其实,xargs
可以非常优雅的进行批量的操作. 下面用几个例子, 演示一下xargs的用法. 一个坑就是使用echo和ls的问题, 这里进行了测试.
创建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
命令:
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
使用两步法, 第一步将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报错的问题. 而且逻辑更加清楚.
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-12-27 01:38
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社