2011-03-06 59 views
6

在POSIX shell中打印最大的10個最大文件列表的最佳做法是什麼?必須有比我當前的解決方案更優雅的東西:最大文件的人類可讀,遞歸排序列表

DIR="." 
N=10 
LIMIT=512000 

find $DIR -type f -size +"${LIMIT}k" -exec du {} \; | sort -nr | head -$N | perl -p -e 's/^\d+\s+//' | xargs -I {} du -h {} 

其中LIMIT是限制查找結果的文件大小閾值。

+0

你試過用'du'? – 2011-03-06 20:53:29

+0

@TomaszNurkiewicz是的(請參閱上面的腳本)。問題是'du'沒有對結果進行排序。 – Matti 2011-03-06 20:54:54

+0

給定一個文件系統的隨機塊,是否有可能找到與之相關的文件名? (對於文件/目錄中的那些塊)。如果是這樣,這將是一個非常有效的方式來找到最大的文件。 (我很確定答案是否定的,我之前使用過Google搜索,但也許SO會找到一些東西。)依賴於文件系統? – 2012-01-08 15:13:12

回答

6

這使用awk爲排序鍵創建額外的列。它只調用du一次。輸出應該與du完全一樣。

我把它分成多行,但它可以重新組合成一行。

du -h | 
    awk '{printf "%s %08.2f\t%s\n", 
    index("KMG", substr($1, length($1))), 
    substr($1, 0, length($1)-1), $0}' | 
    sort -r | cut -f2,3 

說明:

  • BEGIN - 創建字符串索引來代替1,2,3爲K,M,G爲通過單位分組,如果沒有單元(尺寸小於1K),那麼就沒有匹配,並返回一個零(完美!)
  • 打印新字段 - 單位,值(使alpha-sort正常工作,它是零填充,固定長度)和原始行
  • 索引大小字段的最後一個字符
  • 拉出大小
  • 結果排序的數字部分,摒棄了多餘的列

嘗試沒有cut命令,看看它在做什麼。

編輯:

下面是它執行AWK腳本中的排序,並且不需要削減版本:

du -h | 
    awk '{idx = sprintf("%s %08.2f %s", 
     index("KMG", substr($1, length($1))), 
     substr($1, 0, length($1)-1), $0); 
     lines[idx] = $0} 
    END {c = asorti(lines, sorted); 
     for (i = c; i >= 1; i--) 
      print lines[sorted[i]]}'