İçinde birçok dosya bulunan dizinleri bulun


33

Bu yüzden, bir müşterim bugün Linode’dan bir e-posta aldı, sunucularının Linode’nin yedekleme servisinin patlamasına neden olduğunu söyledi. Niye ya? Çok fazla dosya var. Güldüm ve sonra koştum:

# df -ih
Filesystem     Inodes IUsed IFree IUse% Mounted on
/dev/xvda        2.5M  2.4M   91K   97% /

Bok. 2.4 milyon inode kullanımda. Neler oluyor ?!

Belli şüphelileri ( /var/{log,cache}ve tüm sitelerin barındırıldığı dizini) aradım ama gerçekten şüpheli bir şey bulamıyorum. Bu canavarın bir yerinde, birkaç milyon dosya içeren bir dizin olduğundan eminim.

Bağlam bir için benim benim yoğun sunucular 200k Inode'u ve benim masaüstü (eski kullanılan depolama 4TB üzerinde olan yüklemek) sadece bir milyonun üzerindedir kullanır. Bir sorun var.

Öyleyse sorum şu, sorunun nerede olduğunu nasıl bulabilirim? Bir duinode var mı?



1
vmstat -1 100 çalıştırın ve bize birazını gösterin. CS'de çok fazla sayıya dikkat edin (İçerik değiştirme). Bazen arızalı bir dosya sistemi inode hatalarını kaybedebilir. Belki de meşru olarak birçok dosya var. Bu bağlantı sizi dosyalar ve düğümler hakkında bilgilendirmelidir. stackoverflow.com/questions/653096/howto-free-inode-usage adresinde lsof komutu ile neyin çalıştığını / açıldığını görmeniz gerekebilir.
j0h

Yanıtlar:


23

/lost+foundBir disk sorunu olup olmadığını kontrol edin ve çok fazla önemsiz muhtemelen ayrı ayrı dosyalar olarak algılandı.

iostatBazı uygulamaların hala deli gibi dosyalar üretip üretmediğini kontrol edin .

find / -xdev -type d -size +100k100kB'den fazla disk alanı kullanan bir dizin olup olmadığını size söyleyecektir. Çok fazla dosya içeren ya da geçmişte çok fazla dosya içeren bir dizin olurdu. Boyut şeklini ayarlamak isteyebilirsiniz.

GNU duiçin dizin girişi başına 1 saymak için bir seçenek kombinasyonu olduğunu sanmıyorum . Bunu, dosyaların listesini findyaparak ve awk içinde biraz sayma yaparak yapabilirsiniz. İşte bir duinode için. Minimal olarak test edilmiş, yeni satırlar içeren dosya adlarıyla baş etmeye çalışmaz.

#!/bin/sh
find "$@" -xdev -depth | awk '{
    depth = $0; gsub(/[^\/]/, "", depth); depth = length(depth);
    if (depth < previous_depth) {
       # A non-empty directory: its predecessor was one of its files
       total[depth] += total[previous_depth];
       print total[previous_depth] + 1, $0;
       total[previous_depth] = 0;
    }
    ++total[depth];
    previous_depth = depth;
}
END { print total[0], "total"; }'

Kullanımı: du-inodes /. Boş olmayan dizinlerin bir listesini, bunlardaki toplam giriş sayısının ve alt dizinlerinin tekrar tekrar yazdırılmasını sağlar. Çıktıyı bir dosyaya yönlendirin ve istediğiniz zaman gözden geçirin. sort -k1nr <root.du-inodes | headSize en büyük suçluları söyleyeceğim.


Betik hata verir:awk: line 2: find: regular expression compile failed (bad class -- [], [^] or [) [^ awk: line 2: syntax error at or near ] `/tmp/tmpw99dhs': Permission denied
Radu Rădeanu

@ RaduRădeanu Ah, görüyorum ki, diğer sürümlerde çalışmayan bir gawk özelliği kullandım. POSIX uyarınca gerekli olduğunu düşündüğüm bir ters eğik çizgi ekledim.
Gilles 'SO- kötü olmayı'

14

Bu senaryo ile kontrol edebilirsiniz:

#!/bin/bash

if [ $# -ne 1 ];then
  echo "Usage: `basename $0` DIRECTORY"
  exit 1
fi

echo "Wait a moment if you want a good top of the bushy folders..."

find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do 
    echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'

exit 0

Bu, ilk 10 alt dizini dosya sayısına göre yazdırır. Eğer bir üst x, değişiklik istiyorsanız headile head -n x, x0'dan büyük bir doğal sayı daha büyük.

% 100 kesin sonuç için bu komut dosyasını kök ayrıcalıklarıyla çalıştırın:

Üst gür klasörler


2019: büyüdü 10: read: Illegal option -d... kötü bir şey olmayacağını umarak -dbayrağını temizledi read.
Williams

3

Bulmaktan çok daha hızlı, eğer veritabanını güncellerseniz:

# locate '' | sed 's|/[^/]*$|/|g' | sort | uniq -c | sort -n | tee filesperdirectory.txt | tail

Bu konum tüm veri tabanını doldurur, yoldaki son '/' işaretinden sonraki her şeyi çıkarır, ardından sort ve "uniq -c" size dizin başına dosya / dizin sayısını verir. "sort -n", içinde onlarla ilgili en fazla on dizini alabilmeniz için kuyruk haline getirildi.


+1: locate veritabanını kullanmak çok hoş bir fikir!
Max Beikirch

Herhangi bir nedenle bulmayı kullanamadığınızda, find /path/to/parent -xdev > filelistönce bir komutu çalıştırın , sonra da listeden girişi okumak için doğrudan sed komutunu kullanın.
gerrit

1

Başka bir öneri:

http://www.iasptk.com/20314-ubuntu-find-large-files-fast-from-command-line

Sunucunuzdaki en büyük dosyaları bulmak için bu aramaları kullanın.

1GB'ın üzerindeki dosyaları bulun

sudo find / -type f -size + 1000000k -exec ls -lh {} \;

100 MB'ın üzerindeki dosyaları bulun

sudo find / -type f -size + 100000k -exec ls -lh {} \;

10 MB'den büyük dosyaları bulun

sudo find / -type f -size + 10000k -exec ls -lh {} \;

İlk bölüm, kilobayt cinsinden ölçülen farklı boyutlardaki dosyaları bulmak için "-size" bayrağını kullanan find komutudur.

"-Exec" ile başlayan sondaki son bit, bulduğumuz her dosyada yürütmek istediğimiz bir komutu belirtmenizi sağlar. Burada bir dizinin içeriğini listelerken görmek tüm bilgileri içeren "ls -lh" komutu. Sonuna doğru h, her dosyanın boyutunu insan tarafından okunabilir bir biçimde yazdırdığı için özellikle yararlıdır.


2
Onun sorunu, büyük olanları değil, birçok küçük dosyayı işaret eden yüksek inode kullanımıdır.
UpTheCreek

0

Bu benim için çalıştı, diğeri kabukta Android'de başarısız oldu:

find / -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25

0

du --inodes -d 1Özyinelemeli veya doğrudan birçok dosya içeren bir dizin bulmak gibi bir şey kullanmayı seviyorum .

Bu cevabı da beğendim: https://unix.stackexchange.com/a/123052

Tembeliz için, işte bunun özü:

du --inodes -S | sort -rh | sed -n \
    '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.