免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7309 | 回复: 20
打印 上一主题 下一主题

[文件目录] 如何高效地将大量小文件平均分到各个文件夹中? [复制链接]

论坛徽章:
1
白羊座
日期:2014-11-13 10:19:16
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-22 08:17 |只看该作者 |倒序浏览
本帖最后由 iocg 于 2014-09-22 09:01 编辑

现某文件夹A下有100w个小文件(.txt),大小10K左右。

假设文件数量的阈值设为20W。
将在A文件夹自动生成5个文件夹(命名:1~5),将100W个文件每20W个移动至5个文件夹中(不用按顺序)。

如何实现,怎样才能保证高效?

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
2 [报告]
发表于 2014-09-22 09:02 |只看该作者
本帖最后由 bulletmarquis 于 2014-09-22 09:31 编辑

我的习惯
  1. ll|grep ^-|awk '{_cmd_="cp -f "$NF" "NR%5+1"/";_cmd_|getline;close(_cmd_)}'
复制代码
不过文件多的话,逐个cp或者mv效率不高,可以改成先把文件名写到数组里,等攒到一定数量,再拼装cp语句

论坛徽章:
1
白羊座
日期:2014-11-13 10:19:16
3 [报告]
发表于 2014-09-22 09:22 |只看该作者
回复 2# bulletmarquis


    拼装cp语句?求大神解释。。

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
4 [报告]
发表于 2014-09-22 09:35 |只看该作者
本帖最后由 bulletmarquis 于 2014-09-22 10:02 编辑

回复 3# iocg


    拿26*5个文件做测试,先创建文件和目录
  1. touch {a..z}{1..5}
  2. mkdir 1 2 3 4 5
复制代码
下面处理时,每20个文件操作一次,测试效果(当然LZ文件很多,20个太小了,可以将NR%20==0改成合适的值)
  1. ll|grep ^-|awk '{a[NR%5+1]=a[NR%5+1]" "$NF}NR%20==0{for (i in a){_cmd_="cp -f "a[i]" "i"/";print _cmd_}delete a;print ""}'
  2. cp -f  a3 b3 c3 d3 4/
  3. cp -f  a4 b4 c4 d4 5/
  4. cp -f  a5 b5 c5 d5 1/
  5. cp -f  a1 b1 c1 d1 2/
  6. cp -f  a2 b2 c2 d2 3/

  7. cp -f  e3 f3 g3 h3 4/
  8. cp -f  e4 f4 g4 h4 5/
  9. cp -f  e5 f5 g5 h5 1/
  10. cp -f  e1 f1 g1 h1 2/
  11. cp -f  e2 f2 g2 h2 3/

  12. cp -f  i3 j3 k3 l3 4/
  13. cp -f  i4 j4 k4 l4 5/
  14. cp -f  i5 j5 k5 l5 1/
  15. cp -f  i1 j1 k1 l1 2/
  16. cp -f  i2 j2 k2 l2 3/

  17. cp -f  m3 n3 o3 p3 4/
  18. cp -f  m4 n4 o4 p4 5/
  19. cp -f  m5 n5 o5 p5 1/
  20. cp -f  m1 n1 o1 p1 2/
  21. cp -f  m2 n2 o2 p2 3/

  22. cp -f  q3 r3 s3 t3 4/
  23. cp -f  q4 r4 s4 t4 5/
  24. cp -f  q5 r5 s5 t5 1/
  25. cp -f  q1 r1 s1 t1 2/
  26. cp -f  q2 r2 s2 t2 3/

  27. cp -f  u3 v3 w3 x3 4/
  28. cp -f  u4 v4 w4 x4 5/
  29. cp -f  u5 v5 w5 x5 1/
  30. cp -f  u1 v1 w1 x1 2/
  31. cp -f  u2 v2 w2 x2 3/
复制代码
实际执行
  1. ll|grep ^-|awk '{a[NR%5+1]=a[NR%5+1]" "$NF}NR%20==0{for (i in a){_cmd_="cp -f "a[i]" "i"/";_cmd_|getline;close(_cmd_)}delete a}'
复制代码

论坛徽章:
769
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
5 [报告]
发表于 2014-09-22 10:07 |只看该作者
本帖最后由 Herowinter 于 2014-09-22 11:05 编辑

回复 1# iocg

感觉可以这样,无法测试,请谨慎使用.
  1. for((i=1;i<=5;i++));do for((j=1;j<=1000;j++))do ls *.txt|head -200|xargs -i mv "{}" $i;done done
复制代码

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
6 [报告]
发表于 2014-09-22 10:48 |只看该作者
回复 2# bulletmarquis


    无法处理文件名包含空格的情况吧

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
7 [报告]
发表于 2014-09-22 11:03 |只看该作者
本帖最后由 bulletmarquis 于 2014-09-22 11:04 编辑

回复 6# Shell_HAT


    确实考虑不周,修改了一下

构造数据
  1. echo {a..z}{1..5}|awk -vRS=" " '{print "" > $0" "$0}'
  2. mkdir 1 2 3 4 5
复制代码
测试效果
  1. ls -F1|grep -v /$|awk '{a[NR%5+1]=a[NR%5+1]" \""$0"\""}NR%20==0{for (i in a){_cmd_="cp -f "a[i]" "i"/";print _cmd_}delete a;print ""}'
复制代码
实际执行
  1. ls -F1|grep -v /$|awk '{a[NR%5+1]=a[NR%5+1]" \""$0"\""}NR%20==0{for (i in a){_cmd_="cp -f "a[i]" "i"/";_cmd_|getline;close(_cmd_)}delete a;print ""}'
复制代码

论坛徽章:
2
摩羯座
日期:2014-11-03 15:28:56卯兔
日期:2015-01-04 17:20:51
8 [报告]
发表于 2014-09-22 11:08 |只看该作者
回复 6# Shell_HAT


    搭车请教一下,如果文件名中会有空格的话,有没有好办法只取出文件名来且逐行展示文件名?

   看了半天ls --help,只有
ls -F1|grep -v /$
能行,但是如果目录下还有链接啥的,就很麻烦

   有没有其他好办法?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2014-09-22 11:49 |只看该作者
回复 1# iocg


    先把文件列表分割到5份(split),即5个文件, 再用这5个文件为输入,xargs mv 文件到相应的文件夹。

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2014-09-22 11:55 |只看该作者
回复 9# blackold

这样效率应该比用for循环高
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP