GNU/Linux >> Belajar Linux >  >> Linux

Tentukan Lokasi Penggunaan Inode

Solusi 1:

Jangan berharap ini berjalan cepat...

cd ke direktori tempat Anda menduga mungkin ada subdirektori dengan banyak inode. Jika skrip ini membutuhkan banyak waktu, Anda mungkin menemukan di mana mencarinya di sistem file. /var adalah awal yang baik...

Jika tidak, jika Anda mengubah ke direktori teratas dalam sistem file itu dan menjalankan ini 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 menyortir hasil yang tidak disortir terhadap 350.000 direktori membutuhkan waktu 8 detik. Penemuan awal mengambil . Biaya sebenarnya adalah membuka semua direktori ini di while loop. (loop itu sendiri membutuhkan waktu 22 detik). (Data pengujian dijalankan pada subdirektori dengan 350.000 direktori, salah satunya memiliki sejuta file, sisanya memiliki antara 1 dan 15 direktori).

Berbagai orang telah menunjukkan bahwa ls tidak bagus dalam hal itu karena memilah hasilnya. Saya telah mencoba gema, tetapi itu juga tidak bagus. Orang lain telah menunjukkan bahwa stat memberikan info ini (jumlah entri direktori) tetapi itu tidak portabel. Ternyata find -maxdepth sangat cepat dalam membuka direktori dan menghitung .file, jadi... ini dia.. poin untuk semuanya!

Solusi 2:

Jika masalahnya adalah satu direktori dengan terlalu banyak file, berikut solusi sederhananya:

# Let's find which partition is out of inodes:
$ df -hi
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda3               2.4M    2.4M       0  100% /
...

# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d

Gagasan di balik find baris 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 angka, dan lebih suka membuat daftar semua direktori yang dicurigai yang diurutkan berdasarkan "ukuran", itu juga mudah:

# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n

Solusi 3:

Grrr, berkomentar membutuhkan 50 perwakilan. Jadi jawaban ini sebenarnya adalah komentar atas jawaban chris.

Karena penanya mungkin tidak peduli dengan semua direktori, hanya yang terburuk, maka penggunaan sortir mungkin akan memakan banyak biaya.

find . -type d | 
while 
  read line  
do 
  echo "$(ls "$line" | wc -l) $line"  
done | 
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]'  | less

Ini tidak selengkap versi Anda, tetapi yang dilakukan adalah mencetak baris jika lebih besar dari maksimum sebelumnya, sangat mengurangi jumlah derau yang dicetak, dan menghemat biaya semacam itu.

Sisi negatifnya adalah jika Anda memiliki 2 direktori yang sangat besar, dan yang pertama memiliki 1 inode lebih banyak daripada yang kedua, Anda tidak akan pernah melihat yang kedua.

Solusi yang lebih lengkap adalah dengan menulis skrip perl yang lebih cerdas yang melacak 10 nilai teratas yang terlihat, dan mencetaknya di bagian akhir. Tapi itu terlalu lama untuk jawaban serverfault yang cepat.

Selain itu, beberapa skrip perl yang agak lebih pintar akan memungkinkan Anda melewati perulangan while - pada sebagian besar platform, ls mengurutkan hasilnya, dan itu juga bisa sangat mahal untuk direktori besar. Pengurutan ls tidak diperlukan di sini, karena yang kami pedulikan hanyalah hitungan.

Solusi 4:

Anda dapat menggunakan cuplikan kecil ini:

find | cut -d/ -f2 | uniq -c | sort -n

Ini akan mencetak berapa banyak file dan direktori di setiap direktori di folder saat ini, dengan pelanggar terbesar di bagian bawah. Ini akan membantu Anda menemukan direktori yang memiliki banyak file. (info selengkapnya)

Solusi 5:

Ini bukan jawaban langsung untuk pertanyaan Anda, tetapi menelusuri file yang baru saja dimodifikasi dengan ukuran kecil menggunakan find dapat mempersempit penelusuran Anda:

find / -mmin -10 -size -20k

Linux
  1. Panduan untuk Perintah "Temukan" Linux

  2. Bagaimana cara saya mendaftar secara rekursif semua direktori di suatu lokasi, luasnya terlebih dahulu?

  3. Bagaimana Cara Membebaskan Penggunaan Inode?

  1. Bagaimana cara mengulang direktori di Linux?

  2. Cara mengetahui penggunaan memori pengguna di linux

  3. Temukan direktori yang berisi sejumlah file

  1. Temukan File dan Direktori di Linux Seperti Profesional

  2. Temukan file dan direktori terbesar di Linux

  3. Bagaimana menemukan hanya direktori tanpa subdirektori?