Это перепечатано отсюда по указанию аскера:
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
ТЕПЕРЬ С ЛС:
Несколько человек упомянули, что у них нет современных coreutils, и опция --inodes для них недоступна. Итак, вот ls:
ls ~/test -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
Если вам любопытно, сердце этого утомительного кусочка regex
заменяет filename
в каждом из ls's
результатов рекурсивного поиска имя каталога, в котором он был найден. Оттуда это просто вопрос сжатия повторяющихся номеров инодов, затем подсчета повторяющихся имен каталогов и соответствующей сортировки.
Эта -U
опция особенно полезна при сортировке, поскольку она не сортирует, а представляет список каталогов в исходном порядке или, другими словами, по inode
номеру.
И, конечно, -1
это невероятно полезно в том смысле, что он обеспечивает один результат на строку, независимо от возможного включения новых строк в именах файлов или других поразительно неудачных проблем, которые могут возникнуть при попытке проанализировать список.
И, конечно, -A
для всех, -i
для inode и -R
для рекурсии, и это длинный и короткий путь .
Основной метод заключается в том, что я заменяю каждое из имен файлов ls на содержащее его имя каталога в sed. Исходя из этого ... Ну, я немного нечеткий сам. Я вполне уверен, что он точно считает файлы, как вы можете видеть здесь:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
Это дает мне почти идентичные результаты для 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
, что все зависит от того, на какой каталог программа сначала смотрится - потому что они одинаковые и жестко связаны. Вроде как вещь выше. Хотя я могу ошибаться в этом - и я приветствую исправление ...
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 .
Посмотрите на жесткие ссылки:
% 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 ./
Так что я думаю, что это показывает, что единственный способ подсчитать inode - это inode. А поскольку подсчет файлов означает подсчет инодов, вы не можете вдвойне подсчитывать иноды - для точного подсчета файлов иноды не могут быть подсчитаны более одного раза.