Jangan berharap ini berjalan cepat ...
cd ke direktori tempat Anda mencurigai ada subdirektori dengan banyak inode. Jika skrip ini membutuhkan banyak waktu, Anda mungkin akan menemukan di mana dalam filesystem yang akan dicari. / var adalah awal yang baik ...
Jika tidak, jika Anda mengubah ke direktori teratas dalam sistem file itu dan menjalankannya dan menunggu sampai selesai, Anda akan menemukan direktori dengan semua inode.
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Saya tidak khawatir tentang biaya penyortiran. Saya menjalankan tes dan memilah-milah output yang tidak disortir itu terhadap 350.000 direktori membutuhkan waktu 8 detik. Temuan awal mengambil. Biaya sebenarnya adalah membuka semua direktori ini di loop sementara. (loop itu sendiri membutuhkan waktu 22 detik). (Data uji dijalankan pada subdirektori dengan 350.000 direktori, salah satunya memiliki sejuta file, sisanya memiliki antara 1 dan 15 direktori).
Berbagai orang telah menunjukkan bahwa itu tidak hebat karena itu memilah output. Saya sudah mencoba gema, tetapi itu juga tidak bagus. Orang lain telah menunjukkan bahwa stat memberikan info ini (jumlah entri direktori) tetapi tidak portabel. Ternyata find -maxdepth sangat cepat dalam membuka direktori dan menghitung .file, jadi ... ini dia .. poin untuk semua orang!
Jika masalahnya adalah satu direktori dengan terlalu banyak file, berikut ini adalah solusi sederhana:
Gagasan di balik
find
garis adalah bahwa ukuran direktori sebanding dengan jumlah file langsung di dalam direktori itu. Jadi, di sini kita mencari direktori dengan banyak file di dalamnya.Jika Anda tidak ingin menebak nomor, dan lebih memilih untuk mencantumkan semua direktori yang dicurigai diurutkan berdasarkan "ukuran", itu juga mudah:
sumber
Grrr, berkomentar membutuhkan 50 rep. Jadi jawaban ini sebenarnya adalah komentar atas jawaban chris.
Karena si penanya mungkin tidak peduli dengan semua direktori, hanya yang terburuk, maka menggunakan sortir kemungkinan besar sangat mahal.
Ini tidak selengkap versi Anda, tetapi yang dilakukan adalah mencetak baris jika lebih besar dari maksimum sebelumnya, sangat mengurangi jumlah kebisingan yang tercetak, dan menghemat biaya semacam itu.
Kelemahan dari ini adalah jika Anda memiliki 2 direktori yang sangat besar, dan yang pertama memiliki 1 lebih banyak inode daripada yang ke-2, Anda tidak akan pernah melihat yang ke-2.
Solusi yang lebih lengkap adalah dengan menulis skrip perl yang lebih cerdas yang melacak 10 nilai teratas yang terlihat, dan mencetaknya di akhir. Tapi itu terlalu lama untuk jawaban serverfault yang cepat.
Juga, beberapa skrip perl yang lebih pintar akan membuat Anda melewatkan loop while - pada sebagian besar platform, seperti hasil, dan itu juga bisa sangat mahal untuk direktori besar. Jenis ini tidak diperlukan di sini, karena yang kita pedulikan hanyalah hitungan.
sumber
Anda dapat menggunakan potongan kecil ini:
Ini akan mencetak berapa banyak file dan direktori di masing-masing direktori di folder saat ini, dengan pelanggar terbesar di bagian bawah. Ini akan membantu Anda menemukan direktori yang memiliki banyak file. ( info lebih lanjut )
sumber
Ini bukan jawaban langsung untuk pertanyaan Anda, tetapi mencari file yang baru dimodifikasi dengan ukuran kecil menggunakan find mungkin mempersempit pencarian Anda:
sumber
Ia tidak akan menemukan file yang namanya dimulai dengan titik. Menggunakan find menghindari ini. Ini menemukan setiap file di pohon direktori, memotong nama samaran dari akhir setiap jalur, dan menghitung berapa kali setiap jalur direktori muncul di hasil yang dihasilkan. Anda mungkin harus meletakkan "!" dalam kutipan jika shell Anda mengeluhkannya.
Inode juga dapat digunakan oleh file yang telah dihapus tetapi ditahan terbuka oleh proses yang sedang berjalan. Jika paket Munin ini termasuk program yang terus berjalan, hal lain yang perlu diperiksa adalah apakah paket itu dibuka dengan jumlah file yang tidak biasa.
sumber
Saya akan memaksa yang satu ini: jalankan tripwire pada seluruh perangkat untuk baseline, kemudian jalankan pemeriksaan beberapa waktu kemudian dan direktori yang menyinggung akan menonjol seperti jempol sakit.
sumber
(Tidak bisa berkomentar benar-benar menjadi tua - ini untuk egorgry)
egorgry - ls -i mencetak inode NUMBER untuk sebuah entri, bukan COUNT inode.
Cobalah dengan file di direktori Anda - Anda (mungkin) akan melihat angka yang sama-sama tinggi, tetapi itu bukan jumlah inode, itu hanya inode yang # titik masuk direktori Anda.
sumber
Memperbarui
Satu liner yang mengembalikan jumlah inode setiap anak dari direktori yang diberikan dengan entri terbesar di bagian bawah.
Jawaban Asli
Jalankan seperti ini (mengingat bahwa skrip di atas berada di file yang dapat dieksekusi di direktori kerja Anda)
sumber
penggunaan inode kira-kira satu per file atau direktori, kan? Begitu juga
untuk menghitung kira-kira berapa banyak inode yang digunakan di bawah [path].
sumber
Saya mencoba menulis pipa shell yang efisien, tetapi menjadi sulit dan lambat atau tidak akurat, misalnya,
akan mendaftar direktori leaf (dan beberapa lainnya) dengan lebih dari 1000 file di dalamnya. Jadi, inilah skrip Perl untuk melakukannya secara efisien dalam waktu dan RAM. Outputnya seperti
«Files-in-subtree» «files-direct-in-directory» «direktori-nama»
sehingga Anda dapat memijat dan memfilternya dengan mudah menggunakan alat normal, misalnya, urutkan (1) atau awk (1) seperti di atas.
sumber
rumah saya di laptop saya menggunakan 131191 inode.
sumber