亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 如何高效地將大量小文件平均分到各個(gè)文件夾中? [打印本頁]

作者: iocg    時(shí)間: 2014-09-22 08:17
標(biāo)題: 如何高效地將大量小文件平均分到各個(gè)文件夾中?
本帖最后由 iocg 于 2014-09-22 09:01 編輯

現(xiàn)某文件夾A下有100w個(gè)小文件(.txt),大小10K左右。

假設(shè)文件數(shù)量的閾值設(shè)為20W。
將在A文件夾自動生成5個(gè)文件夾(命名:1~5),將100W個(gè)文件每20W個(gè)移動至5個(gè)文件夾中(不用按順序)。

如何實(shí)現(xiàn),怎樣才能保證高效?


作者: bulletmarquis    時(shí)間: 2014-09-22 09:02
本帖最后由 bulletmarquis 于 2014-09-22 09:31 編輯

我的習(xí)慣
  1. ll|grep ^-|awk '{_cmd_="cp -f "$NF" "NR%5+1"/";_cmd_|getline;close(_cmd_)}'
復(fù)制代碼
不過文件多的話,逐個(gè)cp或者mv效率不高,可以改成先把文件名寫到數(shù)組里,等攢到一定數(shù)量,再拼裝cp語句
作者: iocg    時(shí)間: 2014-09-22 09:22
回復(fù) 2# bulletmarquis


    拼裝cp語句?求大神解釋。。
作者: bulletmarquis    時(shí)間: 2014-09-22 09:35
本帖最后由 bulletmarquis 于 2014-09-22 10:02 編輯

回復(fù) 3# iocg


    拿26*5個(gè)文件做測試,先創(chuàng)建文件和目錄
  1. touch {a..z}{1..5}
  2. mkdir 1 2 3 4 5
復(fù)制代碼
下面處理時(shí),每20個(gè)文件操作一次,測試效果(當(dāng)然LZ文件很多,20個(gè)太小了,可以將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/
復(fù)制代碼
實(shí)際執(zhí)行
  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}'
復(fù)制代碼

作者: Herowinter    時(shí)間: 2014-09-22 10:07
本帖最后由 Herowinter 于 2014-09-22 11:05 編輯

回復(fù) 1# iocg

感覺可以這樣,無法測試,請謹(jǐn)慎使用.
  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
復(fù)制代碼

作者: Shell_HAT    時(shí)間: 2014-09-22 10:48
回復(fù) 2# bulletmarquis


    無法處理文件名包含空格的情況吧
作者: bulletmarquis    時(shí)間: 2014-09-22 11:03
本帖最后由 bulletmarquis 于 2014-09-22 11:04 編輯

回復(fù) 6# Shell_HAT


    確實(shí)考慮不周,修改了一下

構(gòu)造數(shù)據(jù)
  1. echo {a..z}{1..5}|awk -vRS=" " '{print "" > $0" "$0}'
  2. mkdir 1 2 3 4 5
復(fù)制代碼
測試效果
  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 ""}'
復(fù)制代碼
實(shí)際執(zhí)行
  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 ""}'
復(fù)制代碼

作者: bulletmarquis    時(shí)間: 2014-09-22 11:08
回復(fù) 6# Shell_HAT


    搭車請教一下,如果文件名中會有空格的話,有沒有好辦法只取出文件名來且逐行展示文件名?

   看了半天ls --help,只有
ls -F1|grep -v /$
能行,但是如果目錄下還有鏈接啥的,就很麻煩

   有沒有其他好辦法?
作者: blackold    時(shí)間: 2014-09-22 11:49
回復(fù) 1# iocg


    先把文件列表分割到5份(split),即5個(gè)文件, 再用這5個(gè)文件為輸入,xargs mv 文件到相應(yīng)的文件夾。
作者: yestreenstars    時(shí)間: 2014-09-22 11:55
回復(fù) 9# blackold

這樣效率應(yīng)該比用for循環(huán)高
   
作者: Herowinter    時(shí)間: 2014-09-22 12:06
回復(fù) 9# blackold

黑哥的算法學(xué)得真好,分治法分分鐘搞定,不得不服.
   
作者: reyleon    時(shí)間: 2014-09-22 13:35
來個(gè)偽多進(jìn)程并發(fā) mv
作者: iocg    時(shí)間: 2014-09-22 14:03
回復(fù) 9# blackold


    能不能給個(gè)代碼參考下呢?
作者: yestreenstars    時(shí)間: 2014-09-22 14:24
回復(fù) 13# iocg

大概是這樣:
  1. ls | split -l 200000
  2. mkdir {0..4}
  3. awk '{cmd="mv "$0" "int(NR/200000);system(cmd);close(cmd)}' x*
復(fù)制代碼

作者: blackold    時(shí)間: 2014-09-22 17:43
本帖最后由 blackold 于 2014-09-23 13:29 編輯

回復(fù) 13# iocg
  1. mkdir {1..5}

  2. prefix=prefix$$

  3. find -maxdepth 1 -type f -name '*.txt' | split -l 200000 -d -a1 - $prefix

  4. for i in {1..5};do xargs -a $prefix$i -d '\n' mv -i -t $i;done

  5. rm $prefix[0-9]
復(fù)制代碼
原來不是我的錯(cuò), 是論壇的錯(cuò)。

@Shell_HAT
作者: bulletmarquis    時(shí)間: 2014-09-22 18:42
回復(fù) 15# blackold


    黑哥這句 prefix=prefix$ 是啥意思。


作者: blackold    時(shí)間: 2014-09-22 18:47
回復(fù) 16# bulletmarquis


    漏了,是$$
作者: Shell_HAT    時(shí)間: 2014-09-23 12:56
回復(fù) 17# blackold
  1. #1個(gè)$的實(shí)際效果:
  2. $
  3. #2個(gè)$的實(shí)際效果:
  4. $
  5. #3個(gè)$的實(shí)際效果:
  6. $$
  7. #4個(gè)$的實(shí)際效果:
  8. $$
復(fù)制代碼

作者: blackold    時(shí)間: 2014-09-23 13:21
本帖最后由 blackold 于 2014-09-23 13:21 編輯

回復(fù) 18# Shell_HAT


    Shell_HAT 什么意思? 看不懂。
作者: Shell_HAT    時(shí)間: 2014-09-23 13:24
回復(fù) 19# blackold


    Discuz論壇的兩個(gè)JS腳本有bug,兩個(gè)$符號放在code標(biāo)簽里面會丟掉一個(gè)。
作者: blackold    時(shí)間: 2014-09-23 13:26
回復(fù) 20# Shell_HAT


    是這樣啊,以前真沒注意。




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2