2013-12-19 72 views
2

我有一個巨大的文件集6.4萬,我想創建一個bash腳本,列出了使用bash腳本列出文件定期

ls -1 > file.txt 

爲每4,000個文件的文件名和保存結果文件.txt在一個單獨的文件夾中。因此,每4000個文件的名稱都列在存儲在文件夾中的文本文件中。其結果是

FOLDER01包含file.txt的文件,列出文件#0-#4000

folder02包含file.txt的文件,列出文件#4001-#8000

FOLDER03包含file.txt的文件,列出文件# 8001-#12000

folder16包含file.txt的文件,列出文件#60000-#64000

非常感謝你提前

回答

5

您可以嘗試

ls -1 | awk ' 
{ 
    if (! ((NR-1)%4000)) { 
     if (j) close(fnn) 
     fn=sprintf("folder%02d",++j) 
     system("mkdir "fn) 
     fnn=fn"/file.txt" 
    } 
    print >> fnn 
}' 

說明:

  • NR是awk中的當前記錄號,即:當前行號。
  • NR從1開始,在第一行,所以我們減去1使得if語句是第一行
  • system真正從AWK中調用操作系統功能
  • 本身
  • print打印當前行到標準輸出,我們可以重定向(及附加)輸出使用>>
  • 在awk中所有未初始化的變量將有一個零值的文件,所以我們沒有必要說j=0在節目的開頭
+2

好的,對於你的腳本如何解釋也會有用。 – fedorqui

+0

@fedorqui感謝您的評論,但我不想添加任何解釋,除非OP請求它。 –

+1

嗯,我喜歡認爲答案不是OP,而是所有可能進入網站的人看見。所以理解越多越好:更多的人可以學習。但是,這是我的看法,當然。 – fedorqui

2

這將讓你很接近;

ls -1 | split -l 4000 -d - folder

運行的lssplit通過的結果,打破每4000線(-l 4000),使用數字後綴(-d),從標準輸入(-)和啓動文件的命名與folder

結果folder00folder01,...

0

這裏使用awk一個確切的解決方案:

ls -1 | awk ' 
(NR-1) % 4000 == 0 {    
    dir = sprintf("folder%02d", ++nr) 
    system("mkdir -p " dir);    
}          
{ print >> dir "/file.txt"} ' 
0

已經有一些上面很好的答案,但我也建議你看一看的watch命令。這將每隔n秒重新運行一次命令,這樣你就可以看到的輸出。