Linux中xargs批量删除-复制-替换-创建文件

背景

现在有6个文件夹,每个文件夹中有一些文件,想把这些文件提取到一个新的文件夹中。echo ls 以及xargs的不同.

1. lsxargs

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. echoxargs

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

Linux中xargs批量删除-复制-替换-创建文件

上一篇:xargs命令详解,xargs与管道的区别


下一篇:leetcode-最长无重复子数组-79