Intereting Posts
Информация о том, когда пакеты были установлены / обновлены кем и связаны обновления с помощью rkhunter-сканирований (предупреждения rkhunter) Выполнить скрипт автоматически через pbrun? Grep – конкретный столбец Как копировать только каталоги с определенным файлом в этом каталоге Shift + Меню как горячая клавиша в KDE Как я могу работать с инструментами GUI через удаленный сервер? Разрешить пользователю доступ к их собственному каталогу / var / www / html, ничего другого проверить порядковый номер в трейлере файла Изменить фон терминала из сценария bash в платформе, независимо от среды рабочего стола? Риск сохранения папки данных mysql в кеш linux Использование диска iostat заполняется, когда нет ввода-вывода Как настройки языка работают в процессе? Tsocks с почтовым агентом пользователя mailx не работает Как использовать команду find для перечисления общедоступных записываемых файлов в каталог, не переходя в какие-либо подкаталоги? Изменить пароль программно

Найдите 50 лучших каталогов, содержащих большинство файлов / каталогов на первом уровне?

Как я могу использовать find для создания списка каталогов, которые содержат наибольшее количество файлов. Я бы хотел, чтобы список был от самого высокого до самого низкого. Мне бы хотелось, чтобы в списке было 1 уровень глубины, и я обычно запускаю эту команду из верхней части моей файловой системы, то есть / .

Использование инструментов GNU:

 find / -xdev -type d -print0 | while IFS= read -d '' dir; do echo "$(find "$dir" -maxdepth 1 -print0 | grep -zc .) $dir" done | sort -rn | head -50 

Это использует две команды find . Первый находит каталоги и переводит их в цикл while, который запускает следующий поиск для каждого каталога. Во втором списке перечислены все дочерние файлы / каталоги на первом уровне, в то время как grep подсчитывает их. grep позволяет использовать -print0 со вторым нахождением, поскольку wc не имеет -z эквивалента. Это останавливает имена файлов с новой строкой от подсчета дважды (хотя использование wc и no -print0 не имеет большого значения).

Результат второго find помещается в аргумент для echo поэтому он и имя каталога могут быть легко помещены в одну строку (конструкция $(..) автоматически обрезает новую строку в конце grep ). Затем строки сортируются по числу и 50 наименьшим числам, показанным с head .

Обратите внимание, что это также будет включать в себя каталоги верхнего уровня точек монтирования. Простой способ обойти это – использовать привязку монтирования, а затем использовать каталог монтирования. Сделать это:

 sudo mount --bind / /mnt 

Более портативное решение использует другой экземпляр оболочки для каждого каталога (также здесь ):

 find / -xdev -type d -exec sh -c ' echo "$(find "$0" | grep "^$0/[^/]*$" | wc -l) $0"' {} \; | sort -rn | head -50 

Пример вывода:

 9225 /var/lib/dpkg/info 6322 /usr/share/qt4/doc/html 4927 /usr/share/man/man3 2301 /usr/share/man/man1 2097 /usr/share/doc 2097 /usr/bin 1863 /usr/lib/x86_64-linux-gnu 1679 /var/cache/apt/archives 1628 /usr/share/qt4/doc/src/images 1614 /usr/share/qt4/doc/html/images 1308 /usr/share/scilab/modules/overloading/macros 1083 /usr/src/linux-headers-3.13-1-common/include/linux 1071 /usr/src/linux-headers-3.13-1-amd64/include/config 847 /usr/include/qt4/QtGui 774 /usr/include/qt4/Qt 709 /usr/share/man/man8 616 /usr/lib 611 /usr/share/icons/oxygen/32x32/actions 608 /usr/share/icons/oxygen/22x22/actions 598 /usr/share/icons/oxygen/16x16/actions 579 /usr/share/bash-completion/completions 574 /usr/share/icons/oxygen/48x48/actions 570 /usr/share/vim/vim74/syntax 546 /usr/share/scilab/modules/m2sci/macros/sci_files 531 /usr/lib/i386-linux-gnu/wine/wine 530 /usr/lib/i386-linux-gnu/wine/wine/fakedlls 496 /etc/ssl/certs 457 /usr/share/mime/application 454 /usr/share/man/man2 450 /usr/include/qt4/QtCore 443 /usr/lib/python2.7 419 /usr/src/linux-headers-3.13-1-common/include/uapi/linux 413 /usr/share/fonts/X11/misc 413 /usr/include/linux 375 /usr/share/man/man5 374 /usr/share/lintian/overrides 372 /usr/share/cmake-2.8/Modules 370 /usr/share/fonts/X11/75dpi 370 /usr/share/fonts/X11/100dpi 356 /usr/share/icons/gnome/24x24/actions 356 /usr/share/icons/gnome/22x22/actions 356 /usr/share/icons/gnome/16x16/actions 353 /usr/share/icons/gnome/48x48/actions 353 /usr/share/icons/gnome/32x32/actions 341 /usr/lib/ghc/ghc-7.6.3 326 /usr/sbin 324 /usr/share/scilab/modules/compatibility_functions/macros 324 /usr/share/scilab/modules/cacsd/macros 320 /usr/share/terminfo/a 319 /usr/share/i18n/locales 

UPDATE: я сделал все это ниже, что здорово, но я придумал лучший способ сортировки каталогов при использовании inode:

 du --inodes -S | sort -rh | sed -n \ '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}' 

И если вы хотите остаться в той же файловой системе, вы делаете:

 du --inodes -xS 

Вот пример вывода:

 15K /usr/share/man/man3 4.0K /usr/lib 3.6K /usr/bin 2.4K /usr/share/man/man1 1.9K /usr/share/fonts/75dpi ... 519 /usr/lib/python2.7/site-packages/bzrlib 516 /usr/include/KDE 498 /usr/include/qt/QtCore 487 /usr/lib/modules/3.13.6-2-MANJARO/build/include/config 484 /usr/src/linux-3.12.14-2-MANJARO/include/config 

СЕЙЧАС С LS:

Несколько человек упомянули, что у них нет современных ячеек, а опция «-inodes» им недоступна. Итак, вот ls:

 sudo ls -AiR1U ./ | sed -rn '/^[./]/{h;n;};G; s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' | sort -t : -uk1.1,1n | cut -d: -f2 | sort -V | uniq -c |sort -rn | head -n10 

Это дает мне почти идентичные результаты для команды du :

DU:

 15K /usr/share/man/man3 4.0K /usr/lib 3.6K /usr/bin 2.4K /usr/share/man/man1 1.9K /usr/share/fonts/75dpi 1.9K /usr/share/fonts/100dpi 1.9K /usr/share/doc/arch-wiki-markdown 1.6K /usr/share/fonts/TTF 1.6K /usr/share/dolphin-emu/sys/GameSettings 1.6K /usr/share/doc/efl/html 

LS:

 14686 /usr/share/man/man3: 4322 /usr/lib: 3653 /usr/bin: 2457 /usr/share/man/man1: 1897 /usr/share/fonts/100dpi: 1897 /usr/share/fonts/75dpi: 1890 /usr/share/doc/arch-wiki-markdown: 1613 /usr/include: 1575 /usr/share/doc/efl/html: 1556 /usr/share/dolphin-emu/sys/GameSettings: 

Я думаю, что include вещь зависит только от того, в какой директории программа сначала смотрит – потому что они одни и те же файлы и hardlinked. Своего рода как выше. Возможно, я ошибаюсь в этом – и я приветствую исправление …

Основной метод заключается в том, что я заменяю все имена файлов ls на его содержащее имя каталога в sed. После этого … Ну, я немного неясен. Я довольно уверен, что он точно подсчитывает файлы, как вы можете видеть здесь:

 % _ls_i ~/test > 100 /home/mikeserv/test/realdir > 2 /home/mikeserv/test > 1 /home/mikeserv/test/linkdir 

DU DEMO

 % du --version > du (GNU coreutils) 8.22 

Создайте тестовый каталог:

 % mkdir ~/test ; cd ~/test % du --inodes -S > 1 . 

Некоторые детские каталоги:

 % mkdir ./realdir ./linkdir % du --inodes -S > 1 ./realdir > 1 ./linkdir > 1 . 

Сделайте несколько файлов:

 % printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin % du --inodes -S > 101 ./realdir > 1 ./linkdir > 1 . 

Некоторые жесткие ссылки:

 % printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` | . /dev/stdin % du --inodes -S > 101 ./realdir > 1 ./linkdir > 1 . 

Посмотрите на hardlinks:

 % cd ./linkdir % du --inodes -S > 101 % cd ../realdir % du --inodes -S > 101 

Они учитываются в одиночку, но идут по одному каталогу …

 % cd .. % du --inodes -S > 101 ./realdir > 1 ./linkdir > 1 . 

Затем я запустил сценарий с запущенным снизу и:

 > 100 /home/mikeserv/test/realdir > 100 /home/mikeserv/test/linkdir > 2 /home/mikeserv/test 

И Грэма:

 > 101 ./realdir > 101 ./linkdir > 3 ./ 

Поэтому я думаю, что это показывает, что единственный способ подсчета inodes – inode. И поскольку подсчет файлов означает подсчет inodes, вы не можете дважды подсчитывать inodes – для подсчета файлов точно inode не могут считаться более одного раза.

OLD:

Я нахожу это быстрее, и он переносится:

 sh <<-\CMD { echo 'here='"$PWD" printf 'cd "${here}/%s" 2>/dev/null && { set -- for glob in ".[!.]*" "[!.]*" ; do set -- $glob "$@" && [ -e "./$1" ] || shift done printf "%%s\\t%%s\\n" $# "$PWD" }\n' $( find . -depth -type d 2>/dev/null ) } | . /dev/stdin | sort -rn | sed -n \ '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}' CMD 

Это не обязательно для -exec для каждого каталога – он использует только один процесс sh ell и один find . Я должен получить set -- $glob вправо, чтобы включить .hidden файлы и все остальное, но это очень близко и очень быстро. Вы просто cd бы в то, что ваш корневой каталог должен быть для проверки и от вас.

Вот пример моего вывода из /usr :

 14684 /usr/share/man/man3 4322 /usr/lib 3650 /usr/bin 2454 /usr/share/man/man1 1897 /usr/share/fonts/75dpi ... 557 /usr/share/gtk-doc/html/gtk3 557 /usr/share/doc/elementary/latex 539 /usr/lib32/wine/fakedlls 534 /usr/lib/python2.7/site-packages/bzrlib 500 /usr/lib/python3.3/test 

Я также использую sed внизу, чтобы обрезать его до 50 лучших результатов. Разумеется, head будет быстрее, но при необходимости я также обрезаю каждую линию:

 ... 159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins 154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace ... 

Понятно, это грубо, но это была мысль. Другое грубое устройство, которое я использую, – это сброс 2>stderr для find и cd в 2>/dev/null . Это просто более чистое, чем просмотр ошибок разрешений для каталогов, которые я не могу прочитать без доступа root – возможно, я должен указать это для find . Ну, это незавершенная работа.

Хорошо, поэтому я исправил globs оболочки следующим образом:

 for glob in ".[!.]*" "[!.]*" ; do set -- $glob "$@" && [ -e "./$1" ] || shift done 

Я на самом деле собирался задать вопрос о том, как это можно сделать, но когда я печатал заголовок вопроса, сайт указал мне на предлагаемый связанный вопрос, где, и вот, Стефан уже взвесил . Так что это было удобно. По-видимому, [^.], Хотя и хорошо поддерживается, не переносится, и вы должны использовать The !bang. Я нашел это в комментарии Стефана.

Во всяком случае, просто вытащить скрытые файлы было недостаточно, хотя, очевидно. Поэтому я должен set дважды, чтобы избежать поиска позиций для буквального $glob . Тем не менее, это никак не влияет на производительность вообще, и он надежно добавляет каждый файл в каталог.

Почему бы не использовать что-то вроде KDirStat. Хотя он был первоначально написан для KDE, но он отлично работает с GNOME, а также дает вам наилучший обзор количества файлов / директорий и соответствующего использования в графическом интерфейсе.