ОНОВЛЕННЯ: Я все це робив нижче, що класно, але я придумав кращий спосіб сортування каталогів за допомогою 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 їм недоступний. Отже, ось:
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
річ просто залежить від того, який каталог спочатку виглядає програма - тому що вони однакові файли та жорстке посилання. Ніби як річ вище. Я можу помилитися з цього приводу - і я вітаю виправлення ...
Основним методом цього є те, що я замінюю кожну 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 .
Подивіться на жорсткі посилання:
% 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
І Graeme:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Тому я думаю, що це свідчить про те, що єдиний спосіб підрахунку inode - це inode. А тому що підрахунок файлів означає підрахунок inode, ви не можете подвоїти підрахунок удвічі - точний підрахунок файлів inodes неможливо перерахувати більше одного разу.
СТАРИЙ:
Я знаходжу це швидше, і це портативно:
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
. Це просто чистіше, ніж дивитися на помилки дозволів для каталогів, які я не можу читати без кореневого доступу - можливо, я повинен це вказати find
. Ну, це незавершена робота.
Гаразд, тому я виправив кульки оболонки так:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
Я насправді збирався задати питання про те, як це можна зробити, але, коли я набирав назву питання, сайт вказав мені на запропоноване споріднене питання, де, ось ось, Стефан вже зважив . Так що було зручно. Мабуть, [^.],
хоча він добре підтримується, не є портативним, і вам доведеться використовувати те, що !bang.
я знайшов, що в коментарі Стефана є.
У будь-якому випадку, очевидно, недостатньо лише затягувати приховані файли. Тому мені доводиться set
двічі, щоб уникнути пошуку позицій для буквального $glob
. Але, схоже, це зовсім не впливає на продуктивність, і він надійно додає кожен файл у каталозі.