GÜNCELLEME: Aşağıdakilerin hepsini yaptım, harikaydı, ama inode kullanarak dizinleri sıralamanın daha iyi bir yolunu buldum:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Ve aynı dosya sisteminde kalmak istiyorsanız, şunları yapın:
du --inodes -xS
İşte bazı örnek çıktı:
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
ŞİMDİ LS İLE:
Birkaç kişi, güncel coreutils'lere sahip olmadıklarını ve --inodes seçeneğinin kendilerine uygun olmadığını belirtti. Yani, işte:
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
Bu bana du
komuta hemen hemen aynı sonuçlar veriyor :
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:
Bence bu include
sadece programın ilk önce hangi dizine bakacağına bağlı - çünkü aynı dosyalar ve hardlinklenmişler. Yukarıdaki gibi bir şey. Yine de bu konuda yanılmış olabilir - ve düzeltme hoş geldiniz ...
Bunun altında yatan yöntem, her birinin ls
dosya adlarını sed.
Bundan sonra aşağıdaki dizin adını içeren dizini ile değiştirmemdir ... Kendimi biraz bulanık hissediyorum. Burada gördüğünüz gibi dosyaları doğru bir şekilde saydığına eminim:
% _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
Bir test dizini yapın:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Bazı çocuk dizinleri:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Bazı dosyalar yapın:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Bazı sabit bağlantılar:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Hardlinklere bak:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Yalnız sayılırlar, ama bir dizine geçin ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Sonra ran betiğimi aşağıdan çalıştırdım ve:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
Ve Graeme'nin:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Bence bu, inode saymanın tek yolunun inode olduğunu gösteriyor. Dosyaları saymak, düğümleri saymak anlamına geldiğinden, düğümleri iki kez saymazsınız - dosyaları doğru bir şekilde saymak için düğümler bir defadan fazla sayılamaz.
ESKİ:
Bunu daha hızlı buluyorum ve taşınabilir:
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
Her dizin için olması gerekmez - yalnızca bir sh
ell işlemini ve birini kullanır find
. Ben almak zorunda set -- $glob
içerecek şekilde hala hakkını .hidden
dosya ve her şeyden, ama çok yakın ve çok hızlı. Sadece olurdu cd
neyse içine kök dizin kontrolü için ve defol git olmalıdır.
İşte benim çıkarımın bir örneği /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
Ayrıca sed
, en altta bulunan 50 sonucu kesmek için altta da kullanıyorum . head
Elbette daha hızlı olurdu, ama gerekirse her bir çizgiyi düzeltirim:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
Kuşkusuz kaba, ama bir düşünce oldu. Başka ham aygıt I kullanımı dökmektedir 2>stderr
hem find
ve cd
içine 2>/dev/null
. Kök erişimi olmadan okuyamıyorum dizinler için izinler hataları bakmaktan daha temiz - belki de bunu belirtmeliyim find
. Bu devam eden bir çalışma.
Tamam, kabuğundaki küreleri şöyle düzelttim:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
Aslında bunun nasıl yapılabileceği hakkında bir soru soracağım, ama soru başlığını yazarken site , Stephane'un çoktan tartıştığı bir soru sordu . Bu yüzden uygun oldu. Görünüşe göre iyi desteklenmiş olsa da, taşınabilir değil ve Stephane'nin yorumunda orada bulduğumu buldum.[^.],
!bang.
Her neyse, sadece gizli dosyaları çekmek açıkçası yeterli değildi. Bu yüzden set
kelimenin tam anlamıyla konum bulmaktan kaçınmak için iki kez yapmak zorundayım $glob
. Yine de performansı hiç etkilemiyor gibi görünüyor ve dizindeki her dosyayı güvenilir bir şekilde ekliyor.