AKTUALIZACJA: Zrobiłem to wszystko poniżej, co jest fajne, ale wymyśliłem lepszy sposób sortowania katalogów według użycia i-węzła:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
A jeśli chcesz pozostać w tym samym systemie plików, robisz:
du --inodes -xS
Oto kilka przykładowych danych wyjściowych:
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
TERAZ Z LS:
Kilka osób wspomniało, że nie mają aktualnych coreutils, a opcja --inodes nie jest dla nich dostępna. Oto 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
To zapewnia mi prawie identyczne wyniki z du
poleceniem:
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:
Myślę, że include
rzecz zależy tylko od tego, który katalog najpierw program wygląda - ponieważ są to te same pliki i są dowiązane. Trochę jak powyższa rzecz. Mogę się jednak mylić - i z zadowoleniem przyjmuję korektę ...
Podstawową metodą tego jest to, że zastępuję każdą z ls
nazw plików zawartymi w niej nazwami katalogów. sed.
Po tym ... Cóż, jestem trochę rozmyty. Jestem całkiem pewien, że dokładnie zlicza pliki, jak widać tutaj:
% _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
Utwórz katalog testowy:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Niektóre katalogi dzieci:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Zrób kilka plików:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Niektóre twarde linki:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Spójrz na twarde linki:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Są liczeni sami, ale idź o jeden katalog wyżej ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Następnie uruchomiłem mój uruchomiony skrypt od dołu i:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
A Graeme's:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Myślę więc, że to pokazuje, że jedynym sposobem zliczania i-węzłów jest użycie i-węzła. A ponieważ zliczanie plików oznacza zliczanie i-węzłów, nie można podwójnie zliczać i-węzłów - aby dokładnie zliczyć pliki, nie można zliczyć więcej niż raz.
STARY:
Znajduję to szybciej i jest przenośny:
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
Nie musi tak być w -exec
przypadku każdego katalogu - używa tylko jednego sh
procesu ell i jednego find
. Muszę nadal mieć set -- $glob
prawo do dołączania .hidden
plików i wszystkiego innego, ale jest bardzo blisko i bardzo szybko. Wystarczy cd
sprawdzić w katalogu głównym, aby sprawdzić i rozpocząć.
Oto przykład mojego wyjścia z /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
Używam również sed
u dołu, aby przyciąć go do 50 najlepszych wyników. head
byłoby oczywiście szybsze, ale w razie potrzeby przycinam również każdą linię:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
Wprawdzie to prymitywne, ale to była myśl. Innym prymitywnym urządzeniem, z którego korzystam, jest zrzutowanie 2>stderr
zarówno do, jak find
i cd
do 2>/dev/null
. Jest to po prostu czystsze niż sprawdzanie błędów uprawnień dla katalogów, których nie mogę odczytać bez dostępu do katalogu głównego - być może powinienem to określić find
. Cóż, to praca w toku.
Ok, więc naprawiłem globusy powłoki w ten sposób:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
I faktycznie zamiar zadać pytanie, w jaki sposób można to zrobić, ale jak byłem wpisując w tytule zapytania strona wskazała mnie do sugerowanej powiązane pytanie , gdzie lo i oto już Stephane zważono . To było wygodne. Najwyraźniej [^.],
dobrze obsługiwany, nie jest przenośny i musisz użyć !bang.
I znalazłem to w komentarzu Stephane'a.
W każdym razie, oczywiście wciągnięcie ukrytych plików nie wystarczyło. Muszę więc set
dwa razy, aby uniknąć szukania literału dla pozycji $glob
. Wydaje się jednak, że wcale nie wpływa to na wydajność i niezawodnie dodaje każdy plik w katalogu.