UPDATE: Saya melakukan semua itu di bawah ini, yang keren, tapi saya menemukan cara yang lebih baik untuk menyortir direktori dengan menggunakan inode:
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Dan jika Anda ingin tetap di sistem file yang sama Anda lakukan:
du --inodes -xS
Berikut beberapa contoh output:
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
SEKARANG DENGAN LS:
Beberapa orang mengatakan mereka tidak memiliki coreutil terbaru dan opsi --inodes tidak tersedia untuk mereka. Jadi, ini dia:
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
Ini memberikan saya hasil yang hampir sama dengan du
perintah:
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:
Saya pikir include
masalahnya tergantung pada direktori mana program terlihat pada awalnya - karena mereka file yang sama dan di-hardlink. Agak suka hal di atas. Saya bisa saja salah tentang itu - dan saya menerima koreksi ...
Metode yang mendasari ini adalah bahwa saya mengganti setiap ls
nama file dengan nama direktori yang berisi di sed.
Mengikuti dari itu ... Yah, saya sendiri agak kabur. Saya cukup yakin itu secara akurat menghitung file, seperti yang Anda lihat di sini:
% _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
Buat direktori pengujian:
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
Beberapa direktori anak-anak:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
Buat beberapa file:
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Beberapa hardlink:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Lihatlah hardlinks:
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
Mereka dihitung sendiri, tetapi naik satu direktori ...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
Kemudian saya menjalankan skrip saya dari bawah dan:
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
Dan Graeme:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
Jadi saya pikir ini menunjukkan bahwa satu-satunya cara untuk menghitung inode adalah dengan inode. Dan karena menghitung file berarti menghitung inode, Anda tidak dapat menghitung dua kali inode - untuk menghitung file secara akurat inode tidak dapat dihitung lebih dari sekali.
TUA:
Saya menemukan ini lebih cepat, dan ini portabel:
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
Tidak harus -exec
untuk setiap direktori - hanya menggunakan proses satu sh
el dan satu find
. Saya harus set -- $glob
tetap benar untuk memasukkan .hidden
file dan yang lainnya, tetapi sangat dekat dan sangat cepat. Anda akan cd
masuk ke direktori root apa saja yang harus Anda periksa dan pergilah.
Berikut ini contoh dari hasil keluaran saya /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
Saya juga menggunakan sed
di bagian bawah sana untuk memotongnya ke 50 hasil teratas. head
akan lebih cepat, tentu saja, tetapi saya juga memotong setiap baris jika perlu:
...
159 /home/mikeserv/.config/hom...hhkdoolnlbekcfllmednbl/4.30_0/plugins
154 /home/mikeserv/.config/hom...odhpcledpamjachpmelml/1.3.11_0/js/ace
...
Memang kasar, memang, tapi itu hanya pemikiran. Perangkat kasar lain yang saya gunakan adalah dumping 2>stderr
untuk keduanya find
dan cd
masuk 2>/dev/null
. Itu lebih bersih daripada melihat kesalahan izin untuk direktori yang tidak dapat saya baca tanpa akses root - mungkin saya harus menentukannya untuk find
. Ya, ini masih dalam proses.
Ok, jadi saya memperbaiki gumpalan shell seperti ini:
for glob in ".[!.]*" "[!.]*" ; do
set -- $glob "$@" &&
[ -e "./$1" ] || shift
done
Saya sebenarnya akan mengajukan pertanyaan tentang bagaimana hal itu bisa dilakukan, tetapi ketika saya mengetikkan judul pertanyaan, situs itu mengarahkan saya ke sebuah pertanyaan terkait yang disarankan di mana, lihatlah, Stephane sudah menimbang . Jadi itu nyaman. Ternyata [^.],
sementara didukung dengan baik, tidak portabel dan Anda harus menggunakan !bang.
saya menemukan bahwa dalam komentar Stephane di sana.
Bagaimanapun, menarik file tersembunyi saja tidak cukup, jelas. Jadi saya harus set
dua kali untuk menghindari mencari posisi untuk literal $glob
. Namun, tampaknya tidak mempengaruhi kinerja sama sekali, dan itu andal menambahkan setiap file dalam direktori.