Linux’ta Büyük Dosyaları Bulma ve Temizleme Teknikleri

Disk doldu uyarısı aldığınızda ya da sistemin yavaşladığını fark ettiğinizde ilk yapmanız gereken şey, hangi dosyaların ne kadar yer kapladığını anlamaktır. Linux’ta bu işi yapmak için onlarca araç ve yöntem var ama hangisini ne zaman kullanacağınızı bilmek, işi gerçekten hızlandırıyor. Bu yazıda büyük dosyaları bulma, analiz etme ve güvenli şekilde temizleme konusunda sahada işe yarayan teknikleri paylaşacağım.

Disk Kullanımını Anlamak: İlk Adım

Büyük dosyaları aramadan önce genel resmi görmek gerekiyor. df ve du komutları bu noktada en temel silahlarınız.

# Disk kullanımına genel bakış
df -h

# Belirli bir dizinin toplam boyutunu görmek
du -sh /var

# Bir dizin altındaki her klasörün boyutunu sıralı görmek
du -h --max-depth=1 /var | sort -rh

du -h --max-depth=1 /var | sort -rh komutu pratikte çok işe yarıyor. Örneğin /var altında /var/log mu yoksa /var/lib mi daha fazla yer kaplıyor, bunu saniyeler içinde anlıyorsunuz. sort -rh kısmındaki -r büyükten küçüğe sıralıyor, -h ise “human readable” yani GB, MB gibi boyutları doğru karşılaştırıyor.

Bir prodüksiyon sunucusunda /var/log‘un 80 GB’a ulaştığını gördüğümde tam olarak bu komutu kullanmıştım. Sorun, bir servisin hata logu yazarken log rotasyonunun devreye girmemesiydi. Ama o noktaya nasıl geldiğimizi anlamak için önce du ile hangi dizinin şiştiğini tespit etmek gerekiyordu.

find Komutu ile Büyük Dosyaları Bulmak

find komutu, büyük dosya avında en güçlü araçtır. Boyut, tarih, tür ve sahiplik gibi onlarca kriter kombinasyonuyla arama yapabilirsiniz.

# 100 MB'dan büyük tüm dosyaları bul
find / -type f -size +100M 2>/dev/null

# Belirli bir dizinde 500 MB'dan büyük dosyaları bul ve boyutlarıyla listele
find /var -type f -size +500M -exec ls -lh {} ; 2>/dev/null

# 1 GB'dan büyük dosyaları bul ve sıralı göster
find / -type f -size +1G -exec du -h {} ; 2>/dev/null | sort -rh

2>/dev/null kısmını es geçmeyin. Özellikle /proc ve /sys gibi sanal dosya sistemlerine erişim hatası aldığınızda terminal çıktısını hata mesajlarıyla doldurmamak için bunu ekliyoruz. Gereksiz hataları bastırıyor ve temiz bir çıktı elde ediyorsunuz.

find Parametrelerini Doğru Kullanmak

-size parametresinde kullandığınız birimler önemli:

  • +100M: 100 Megabyte’tan büyük
  • +1G: 1 Gigabyte’tan büyük
  • +500k: 500 Kilobyte’tan büyük
  • -size 0: Boş dosyalar (0 byte)

Boyut filtresiyle birlikte zaman filtresini de kullanabilirsiniz:

# Son 7 gün içinde değiştirilmiş ve 50 MB'dan büyük dosyalar
find /home -type f -size +50M -mtime -7 2>/dev/null

# 30 günden uzun süredir erişilmemiş büyük log dosyaları
find /var/log -type f -size +10M -atime +30 2>/dev/null

# Belirli uzantıya sahip büyük dosyaları bul
find / -type f -name "*.log" -size +50M 2>/dev/null | head -20

-mtime -7 son 7 gün içinde değiştirilenleri, +30 ise 30 günden daha eski dosyaları gösteriyor. Bu farkı bilmek önemli çünkü yanlış kullanınca tam tersi sonuç alırsınız.

ncdu: Görsel ve İnteraktif Disk Analizi

Komut satırında disk analizi için ncdu (NCurses Disk Usage) adeta oyun değiştirici bir araç. Standart dağıtımlarda gelmeyebilir ama kurulumu dakikalar alıyor.

# Ubuntu/Debian
apt install ncdu

# CentOS/RHEL/Rocky Linux
yum install ncdu
# veya
dnf install ncdu

# ncdu ile belirli bir dizini analiz etmek
ncdu /var

# Tüm sistemi analiz etmek (sanal dosya sistemlerini hariç tut)
ncdu -x /

-x parametresi çok önemli. Bu parametre, ncdu‘nun sadece mevcut dosya sisteminde kalmasını sağlıyor. Olmadan /proc veya /sys gibi sanal dizinlere girmeye çalışır ve anlamsız sonuçlar çıkabilir. Özellikle tüm sistemi tararken mutlaka kullanın.

ncdu çalıştırdığınızda ok tuşlarıyla dizinler arasında gezebilir, d tuşuyla doğrudan silme işlemi yapabilir, s ile boyuta göre sıralama yapabilirsiniz. Büyük dosyaları görsel olarak takip etmek için ideal.

Log Dosyalarını Temizlemek

Prodüksiyon ortamlarında disk dolmasının en yaygın sebebi log dosyalarıdır. /var/log altında binlerce satır hata logu birikmiş olabilir.

# Log dizinindeki büyük dosyaları listele
find /var/log -type f -size +100M -exec ls -lh {} ; 2>/dev/null

# Bir log dosyasını truncate ile temizlemek (dosyayı silmeden)
truncate -s 0 /var/log/syslog

# Eski log dosyalarını bulmak ve silmek (30 günden eski)
find /var/log -name "*.gz" -mtime +30 -delete

# journald loglarını temizlemek
journalctl --vacuum-time=7d
journalctl --vacuum-size=500M

Önemli not: Log dosyalarını silmek yerine truncate -s 0 ile içini boşaltmak çok daha güvenli. Çünkü bir servis o dosyaya aktif olarak yazıyor olabilir. Dosyayı sildiğinizde, servis eski dosya tanımlayıcısına yazmaya devam eder ve disk alanı serbest kalmaz. truncate ise dosyayı açık bırakarak içini sıfırlar.

journalctl --vacuum-time=7d komutu systemd journal loglarını son 7 günden eskilerini temizler. --vacuum-size=500M ise journal boyutunu 500 MB altına indirir. Özellikle Ubuntu ve modern CentOS/RHEL sistemlerde journald çok yer kaplıyor olabilir.

Büyük Dosya Tipleri: Core Dump ve Geçici Dosyalar

Sistem çöküşlerinden sonra oluşan core dump dosyaları ve uygulama geçici dosyaları fark edilmeden devasa boyutlara ulaşabilir.

# Core dump dosyalarını bul
find / -name "core" -o -name "core.*" -type f 2>/dev/null | xargs ls -lh 2>/dev/null

# /tmp dizinindeki eski dosyaları temizle (7 günden eski)
find /tmp -type f -atime +7 -delete

# /tmp altında büyük dosyaları bul
find /tmp -type f -size +50M 2>/dev/null

# Sistemdeki tüm .tmp uzantılı dosyaları bul
find / -name "*.tmp" -size +10M 2>/dev/null | head -20

Core dump dosyaları analiz için gerekli olabilir, bu yüzden silmeden önce log kayıtlarına bakın. Eğer debugger ile incelediyseniz veya ihtiyaç kalmadıysa silebilirsiniz.

Uygulama Cache Dosyalarını Temizlemek

# apt cache temizleme (Debian/Ubuntu)
apt clean
apt autoclean

# yum/dnf cache temizleme
yum clean all
dnf clean all

# pip cache temizleme
pip cache purge

# npm cache temizleme
npm cache clean --force

# Docker kullanıyorsanız kullanılmayan katmanları temizle
docker system prune -a

apt clean tüm indirilen paket dosyalarını siler, apt autoclean ise sadece eski ve artık kullanılmayan olanları temizler. Prodüksiyon sunucularda apt clean tercih edilebilir çünkü cache’i tamamen boşaltır. docker system prune -a ise kullanılmayan tüm image, container ve network’leri temizler, Docker kullanan sistemlerde düzenli çalıştırılmalı.

Duplicate (Yinelenen) Dosyaları Bulmak

Özellikle developer makinelerinde veya backup karmaşasında aynı dosyanın birden fazla kopyası bulunabilir. fdupes aracı bu konuda çok kullanışlı.

# fdupes kurulumu
apt install fdupes

# Belirli bir dizindeki kopyaları bul
fdupes -r /home/user/Downloads

# Kopya dosyaları boyutlarıyla göster
fdupes -rS /home/user/Documents

# Onay alarak kopyaları sil
fdupes -rd /home/user/Downloads

-r recursive yani alt dizinlere de bakıyor, -S boyutları gösteriyor, -d ise interaktif silme moduna giriyor. Silmeden önce -r ile kontrol etmek ve hangi dosyaların kopya olduğunu görmek iyi bir alışkanlık.

Inode Dolulugu: Boyut Kucuk Ama Yer Yok

Bazen df -h makul bir kullanım yüzdesi gösterirken sisteme yeni dosya oluşturamıyor olabilirsiniz. Bu durumda inode tükenmesi söz konusu olabilir.

# Inode kullanımını kontrol et
df -i

# En fazla inode kullanan dizini bul
find / -xdev -type f 2>/dev/null | cut -d "/" -f 2 | sort | uniq -c | sort -rn | head -10

# Küçük ama çok sayıda dosya olan dizinleri bul
for dir in /var/spool /tmp /var/cache; do
    echo "$dir: $(find $dir -type f 2>/dev/null | wc -l) dosya"
done

Mail spool, PHP session dosyaları ve küçük cache dosyaları inode tükenmesinin başlıca nedenleridir. /var/spool/mail ve /var/spool/postfix altında yüz binlerce küçük dosya birikmiş olabilir.

Büyük Dosyaları Sıkıştırarak Yer Kazanmak

Silmek yerine sıkıştırarak yer kazanmak daha güvenli bir yaklaşım olabilir, özellikle log dosyaları için.

# Tek bir büyük log dosyasını sıkıştır
gzip /var/log/büyük_uygulama.log

# Bir dizindeki tüm eski logları sıkıştır
find /var/log -name "*.log.*" -not -name "*.gz" -mtime +3 -exec gzip {} ;

# xz ile daha iyi sıkıştırma (daha yavaş ama daha küçük)
xz -9 /path/to/büyük-dosya.log

# Sıkıştırılmış boyutu önceden tahmin etmek
gzip --best --stdout büyük-dosya.log | wc -c | numfmt --to=iec

gzip hız ve sıkıştırma oranı arasında iyi bir denge sunar. xz -9 daha iyi sıkıştırma yapıyor ama işlemci ve zaman maliyeti yüksek. Büyük log dosyaları için genellikle gzip yeterli.

Gerçek Dünya Senaryosu: /var Doldu Alarmı

Gece saat 02:00’de bir prodüksiyon sunucusunda /var %95 doldu alarmı geldiğini düşünelim. İşte adım adım nasıl yaklaşılır:

# 1. Genel durumu anla
df -h

# 2. /var altında en büyük dizinleri bul
du -h --max-depth=2 /var | sort -rh | head -20

# 3. Büyük dosyaları listele
find /var -type f -size +500M 2>/dev/null -exec ls -lh {} ;

# 4. Hangi process hangi dosyayı açık tutuyor kontrol et
# (silinen ama hala kullanılan dosyalar için)
lsof | grep deleted | awk '{print $7, $1, $2}' | sort -rn | head -20

# 5. Güvenli şekilde büyük log dosyasını temizle
truncate -s 0 /var/log/problem-uygulama.log

# 6. Eski sıkıştırılmış logları temizle
find /var/log -name "*.gz" -mtime +30 -delete

# 7. journald temizle
journalctl --vacuum-size=200M

lsof | grep deleted komutu kritik öneme sahip. Bir dosyayı silerseniz ama bir process o dosyayı açık tutuyorsa, disk alanı serbest kalmaz. lsof ile silinen ama hala açık tutulan dosyaları görebilirsiniz. O process’i yeniden başlatmak ya da truncate kullanmak bu durumda doğru yaklaşım.

Otomatik Temizlik Script’i

Düzenli disk temizliği için basit ama etkili bir script yazabilirsiniz:

#!/bin/bash
# disk-temizlik.sh

LOG_FILE="/var/log/disk-temizlik.log"
ESIK=80  # Disk doluluk uyarı eşiği (%)

echo "$(date) - Disk temizlik başladı" >> $LOG_FILE

# Disk kullanımını kontrol et
KULLANIM=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')

if [ "$KULLANIM" -gt "$ESIK" ]; then
    echo "$(date) - Disk %$KULLANIM dolu, temizlik yapılıyor" >> $LOG_FILE
    
    # 30 günden eski sıkıştırılmış logları sil
    find /var/log -name "*.gz" -mtime +30 -delete
    echo "$(date) - Eski loglar temizlendi" >> $LOG_FILE
    
    # apt cache temizle
    apt clean 2>/dev/null
    echo "$(date) - APT cache temizlendi" >> $LOG_FILE
    
    # journald temizle
    journalctl --vacuum-time=14d >> $LOG_FILE 2>&1
    
    # /tmp altındaki eski dosyaları temizle
    find /tmp -type f -atime +7 -delete
    
    # Yeni disk durumunu logla
    df -h / >> $LOG_FILE
fi

echo "$(date) - Disk temizlik tamamlandı" >> $LOG_FILE

Bu script’i crontab’a ekleyerek düzenli çalıştırabilirsiniz:

# Her gün gece 03:00'da çalıştır
0 3 * * * /usr/local/bin/disk-temizlik.sh

Silme İşleminden Önce Güvenlik Kontrolleri

Büyük dosyaları bulmak bir şey, doğru olanı silmek başka bir şey. Birkaç altın kural:

  • Silmeden önce ls -lh ile dosyayı inceleyin. Sahip, izinler ve son değişiklik tarihi size çok şey söyler.
  • Aktif olarak kullanılan dosyaları silmeyin. lsof /path/to/file komutu o dosyayı hangi process’lerin açtığını gösterir.
  • Log dosyalarını silmek yerine truncate -s 0 kullanın. Daha önce söyledim ama tekrar söylemeye değer.
  • Kritik dosyaları silmeden önce yedek alın. cp büyük-dosya.log büyük-dosya.log.backup yeterli.
  • -delete parametresini kullanmadan önce find komutunu -delete olmadan çalıştırın. Ne silineceğini önce görün.
# Önce ne silineceğini gör
find /var/log -name "*.gz" -mtime +30

# Sonuç makul görünüyorsa sil
find /var/log -name "*.gz" -mtime +30 -delete

Bu basit iki adımlı yaklaşım pek çok felaketi önler. -delete parametresini doğrudan ekleyip çalıştırmak kötü bir alışkanlık.

Disk Doluluğunu İzlemek: Proaktif Yaklaşım

Sorun çıktıktan sonra değil, çıkmadan önce haberdar olmak için basit bir izleme mekanizması kurmak gerekiyor.

# Disk kullanımını e-posta ile bildiren basit script
#!/bin/bash
ESIK=85
EMAIL="[email protected]"

df -h | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print $5 " " $6}' | while read OUTPUT; do
    KULLANIM=$(echo $OUTPUT | awk '{print $1}' | tr -d '%')
    MOUNT=$(echo $OUTPUT | awk '{print $2}')
    
    if [ "$KULLANIM" -ge "$ESIK" ]; then
        echo "UYARI: $MOUNT diskinde kullanım %$KULLANIM'e ulaştı" | 
        mail -s "Disk Doluluk Uyarısı: $(hostname)" $EMAIL
    fi
done

Daha gelişmiş bir ortamda Prometheus + Grafana veya Zabbix ile disk metriklerini izlemek çok daha iyi ama basit bir cron job da işinizi görür.

Sonuç

Disk yönetimi, sysadmin işinin vazgeçilmez bir parçası ve proaktif davranmak her zaman reaktif müdahaleden daha az stresli. Özetlemek gerekirse:

  • df -h ve du -h --max-depth=1 ile hızlı genel bakış yapın
  • find ile boyut ve tarih kombinasyonunda büyük dosyaları tespit edin
  • ncdu ile interaktif ve görsel analiz yapın
  • Log dosyalarını silmek yerine truncate -s 0 ile temizleyin
  • lsof | grep deleted ile silinen ama hala tutulan dosyaları kontrol edin
  • journalctl --vacuum-time ile journald’ı düzenli temizleyin
  • Temizlik işlemlerini otomatize edin ve disk doluluk uyarılarını kurun

Gece yarısı alarm almanın önüne geçmenin en iyi yolu, hangi dizinin hangi hızda büyüdüğünü günlük takip etmek. Bir hafta boyunca du -h --max-depth=2 /var | sort -rh çıktısını kaydedin, trend analizi yapın. Nereye dikkat etmeniz gerektiğini kısa sürede anlarsınız.

Yorum yapın