Linux
文件編號的級聯樹
的標準輸出
tree
包含有關文件層次結構的資訊。該工具包含使用大小添加所有文件的大小並僅顯示文件夾 (tree --du -h
) 允許發現大目錄的選項。我正在尋找同樣的東西,但是要尋找文件數量來發現不是那麼大的目錄的熱點,一棵大樹中有數十萬個文件。
原版
您只需要對
-type
您感興趣的 s 進行一次文件系統掃描,然後按包含的文件夾和計數進行匯總。find . -type f ! -type l 2>/dev/null | sed "s|/[^/]*$||g" | sort | uniq -c | awk '$1>=1000'
使用
/etc
50 的基準@門檻值109 . 96 ./apparmor.d/abstractions 138 ./ca-certificates/extracted/cadir 64 ./fonts/conf.avail 81 ./sane.d 58 ./xdg real 0m0.014s user 0m0.015s sys 0m0.018s
反間諜版
由於戰爭似乎已經爆發,我想我會優化我自己的軍械庫,並按照戰時反間諜活動的最佳傳統,肆無忌憚地偷竊
%h\n
。find . -type f ! -type l -printf '%h\n' 2>/dev/null | awk '{dir[$1]++} END{for (d in dir) if (dir[d] >=50) print dir[d], d}'| sort -g 58 ./xdg 64 ./fonts/conf.avail 81 ./sane.d 96 ./apparmor.d/abstractions 109 . 138 ./ca-certificates/extracted/cadir real 0m0.006s user 0m0.005s sys 0m0.005s
由於此操作的執行時間小於我對小目錄的鍵反彈,並且我的整個(2TB)文件系統在大約 1.5 秒內處理完畢,我認為打字成本對我來說是方便的。
儘管我很樂意接受 Glorious @haukelaging 解決方案的超快速度
;)
後腳本我的整個 FS
萌
real 0m1.481s user 0m0.975s sys 0m0.805s
你
real 0m1.586s user 0m1.069s sys 0m0.843s
這似乎是不可能的,
tree
但你可以這樣做:慢版本
find . -type d -exec bash -c 'printf "%7d " '\ '$(find "$1" -mindepth 1 -maxdepth 1 -type f -not -type l -printf . | wc -m); '\ 'printf "%s\n" "$1"' find {} \; 2>/dev/null | awk '$1>1000'
列印文件編號(在這種情況下只有那些大於 1,000 的)和目錄路徑。
在我的 /etc 中執行(文件計數門檻值為 50)輸出:
175 . 70 ./sysconfig 98 ./apparmor.d/abstractions 84 ./gconf/gconf.xml.schemas 122 ./brltty/Text 76 ./sane.d
快速版本
bu5hman 的回答讓我意識到我沒有註意到這有多慢。
所以這是另一種方法的優化版本:
find . -type f -not -type l -printf '%h\n' 2>/dev/null | awk -v th=50 '{ a[$0]++; }; '\ 'END { PROCINFO["sorted_in"]="@unsorted"; for (key in a) if (a[key]<th) delete a[key];'\ ' PROCINFO["sorted_in"]="@val_num_desc";for (key in a) printf "%7d %s\n",a[key],key }'
175 . 122 ./brltty/Text 98 ./apparmor.d/abstractions 84 ./gconf/gconf.xml.schemas 76 ./sane.d 70 ./sysconfig
awk
不僅可以進行過濾,還可以進行計數和排序。它可以按正確的順序執行此操作:計數、過濾、排序。而排序,計數,文件管理器是最差的。當然,這只對巨大的目錄號碼很重要,而
- 大量程序移動少量數據和
- 少量或程序移動更多數據
即使在 /etc 中有 400 多個目錄並且子程序的(可能)100% 的頁面記憶體命中率,這也是了不起的。