背景
现在有6个文件夹,每个文件夹中有一些文件,想把这些文件提取到一个新的文件夹中。echo ls 以及xargs的不同.
1. ls
与xargs
1.1 ls
结果
(base) [dengfei@localhost f90]$ ls y[1-6]/y[1-6]_f90_blup_ggp.csv
y1/y1_f90_blup_ggp.csv y4/y4_f90_blup_ggp.csv
y2/y2_f90_blup_ggp.csv y5/y5_f90_blup_ggp.csv
y3/y3_f90_blup_ggp.csv y6/y6_f90_blup_ggp.csv
1.2. 使用xargs
将其复制到re
文件夹中
(base) [dengfei@localhost f90]$ ls y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs cp re
cp: target ‘y6/y6_f90_blup_ggp.csv’ is not a directory
这里, 使用xargs
默认是将其作为对象,放到ls的最后面,不是我们想要的, 我们使用-i
然后通过{}
进行引用:
(base) [dengfei@localhost f90]$ ls y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -i cp {} re
使用tree查看结果,搞定!
(base) [dengfei@localhost f90]$ tree re
re
├── y1_f90_blup_ggp.csv
├── y2_f90_blup_ggp.csv
├── y3_f90_blup_ggp.csv
├── y4_f90_blup_ggp.csv
├── y5_f90_blup_ggp.csv
└── y6_f90_blup_ggp.csv
0 directories, 6 files
如果cp -v
会显示具体copy的对象过程
(base) [dengfei@localhost f90]$ ls y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -i cp -v {} re
‘y1/y1_f90_blup_ggp.csv’ -> ‘re/y1_f90_blup_ggp.csv’
‘y2/y2_f90_blup_ggp.csv’ -> ‘re/y2_f90_blup_ggp.csv’
‘y3/y3_f90_blup_ggp.csv’ -> ‘re/y3_f90_blup_ggp.csv’
‘y4/y4_f90_blup_ggp.csv’ -> ‘re/y4_f90_blup_ggp.csv’
‘y5/y5_f90_blup_ggp.csv’ -> ‘re/y5_f90_blup_ggp.csv’
‘y6/y6_f90_blup_ggp.csv’ -> ‘re/y6_f90_blup_ggp.csv’
2. echo
与xargs
2.1 echo
结果
结果展示, 结果是类似的
(base) [dengfei@localhost f90]$ echo y[1-6]/y[1-6]_f90_blup_ggp.csv
y1/y1_f90_blup_ggp.csv y2/y2_f90_blup_ggp.csv y3/y3_f90_blup_ggp.csv y4/y4_f90_blup_ggp.csv y5/y5_f90_blup_ggp.csv y6/y6_f90_blup_ggp.csv
2.2 使用xargs将其复制到re文件夹中
使用xargs
默认是将其作为对象,放到ls的最后面,不是我们想要的, 我们使用-i
然后通过{}
进行引用:
(base) [dengfei@localhost f90]$ echo y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -i cp {} re
报错:
(base) [dengfei@localhost f90]$ echo y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -i cp {} re
cp: cannot stat ‘y1/y1_f90_blup_ggp.csv y2/y2_f90_blup_ggp.csv y3/y3_f90_blup_ggp.csv y4/y4_f90_blup_ggp.csv y5/y5_f90_blup_ggp.csv y6/y6_f90_blup_ggp.csv’: No such file or directory
结果显示,echo对应的是字符串, 而ls对应的是单个字符,所以ls能搞定, 但是echo搞不定。
3. 分两步搞定
- 1, 使用ls或者echo打印文件
- 2, 使用xargs每个对象成为一行
- 3, 使用xargs -i 进行制定位置(通过{})
echo y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -n1|xargs -i cp {} re
下面的命令效果一样:
ls y[1-6]/y[1-6]_f90_blup_ggp.csv|xargs -n1|xargs -i cp {} re
这样就消除了是用ls还是echo的问题. 而且逻辑更加清楚.