Каскадное дерево номеров файлов

Вы можете загрузить debootstrap v1.0.93 с сайта snapshot.debian.org, но имейте в виду, что этот сайт не поддерживает шифрование, поэтому вам следует проверять свои загрузки.

http://snapshot.debian.org/package/debootstrap/1.0.93%2Bnmu3/

Если сайт выходит из строя (, что случается иногда ), проверьте Wayback Machine Интернет-архива на наличие кэшированной версии его содержимого.

0
25.04.2020, 02:45
2 ответа

Исходная версия

Вам нужно только выполнить одну проверку файловой системы для -typeинтересующих вас файлов, а затем агрегировать по содержащей их папке и подсчитать.

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

Поскольку время выполнения для этого меньше, чем мой возврат ключа для небольших каталогов, а вся моя (2 ТБ )файловая система обрабатывается за ~1,5 с, я думаю, что накладные расходы на ввод в мою пользу для на манжете один вкладыш -.

Хотя я любезно уступаю молниеносной скорости решения Glorious @haukelaging

;)

Постскриптум вся моя ФС

Мой

real    0m1.481s
user    0m0.975s
sys     0m0.805s

Той

real    0m1.586s
user    0m1.069s
sys     0m0.843s
1
19.03.2021, 02:26

Это кажется невозможным с 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'

Печатает номера файлов (, в данном случае только те, которые больше 1000 )и пути к каталогам.

Выполняется в моем /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. небольшое количество или процессы, перемещающие больше данных

замечательно даже с 400+ каталогами в /etc и (возможно )100% попаданием в кэш страниц для подпроцессов.

2
19.03.2021, 02:26

Теги

Похожие вопросы