Linux

文件編號的級聯樹

  • April 25, 2020

的標準輸出tree包含有關文件層次結構的資訊。該工具包含使用大小添加所有文件的大小並僅顯示文件夾 ( tree --du -h) 允許發現大目錄的選項。

我正在尋找同樣的東西,但是要尋找文件數量來發現不是那麼大的目錄的熱點,一棵大樹中有數十萬個文件。

原版

您只需要對-type您感興趣的 s 進行一次文件系統掃描,然後按包含的文件夾和計數進行匯總。

find . -type f ! -type l 2>/dev/null | sed "s|/[^/]*$||g" | sort | uniq -c | awk '$1>=1000'

使用/etc50 的基準@門檻值

   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不僅可以進行過濾,還可以進行計數和排序。它可以按正確的順序執行此操作:計數、過濾、排序。而排序,計數,文件管理器是最差的。當然,這只對巨大的目錄號碼很重要,而

  1. 大量程序移動少量數據和
  2. 少量或程序移動更多數據

即使在 /etc 中有 400 多個目錄並且子程序的(可能)100% 的頁面記憶體命中率,這也是了不起的。

引用自:https://unix.stackexchange.com/questions/582350