Linux’ta Yedek Dosyalarını Yönetme: .bak, .orig ve Otomatik Oluşturulan Uzantıları Bulma, Temizleme ve Denetleme

Üretim sunucularında yeterince uzun süre çalışınca bir şeyi fark ediyorsunuz: disk dolmaya başladığında suçlu çoğunlukla büyük log dosyaları değil, yıllarca biriken .bak, .orig, .old, .tmp uzantılı dosyalardır. Bir konfigürasyon değişikliği yaparken “bir dakika yedek alayım” deyip oluşturduğunuz dosyalar, zamanla onlarca dizine yayılır ve kimse bunları temizlemeyi düşünmez. Bu yazıda bu dosyaları sistematik olarak nasıl bulacağınızı, güvenli şekilde temizleyeceğinizi ve periyodik denetim mekanizmaları kuracağınızı ele alacağız.

Yedek Uzantıları Neden Birikirler?

Meselenin teknik boyutuna geçmeden önce bu kaosa nasıl sürüklendiğimizi anlamak gerekiyor. Birkaç farklı kaynak var:

Manuel yedekler: cp nginx.conf nginx.conf.bak gibi komutlarla oluşturulan dosyalar. Bunlar genellikle “şimdi bir şeyler deneyeyim, sonra silerim” niyetiyle açılır ama silinmez.

Editör artıkları: vim, nano, gedit gibi editörler kimi zaman otomatik yedek oluşturur. Vim’in swap dosyaları (.swp, .swo) veya emacs‘ın tilde uzantılı dosyaları (dosya.conf~) bunların en yaygın örnekleri.

Paket yöneticisi artıkları: apt, yum, dpkg gibi araçlar konfigürasyon dosyalarını güncellerken .dpkg-old, .dpkg-dist, .rpmnew, .rpmsave gibi uzantılı yedekler bırakır. Bunlar özellikle tehlikelidir çünkü sistemin beklediğinden farklı konfigürasyonlar içerebilirler.

Yazılım kurulum scriptleri: Pek çok kurulum scripti mevcut dosyaların üzerine yazmadan önce .orig uzantısıyla yedek alır.

sed -i ve benzeri komutlar: sed -i.bak 's/eski/yeni/' dosya.conf gibi komutlar kullanıldığında .bak uzantılı yedek otomatik oluşur.

Sistematik Arama: find Komutunun Gücü

En temel araç find‘dir. Basit görünür ama doğru parametrelerle inanılmaz esneklik sunar.

Tek Uzantıya Göre Arama

find /etc -name "*.bak" -type f 2>/dev/null
find /etc -name "*.orig" -type f 2>/dev/null
find /etc -name "*.old" -type f 2>/dev/null

2>/dev/null kısmını atlamayın, aksi halde “Permission denied” mesajları çıktıyı karıştırır ve gerçekten önemli sonuçları gözden kaçırırsınız.

Birden Fazla Uzantıyı Aynı Anda Aramak

find /etc /home /var/www -type f ( 
  -name "*.bak" 
  -o -name "*.orig" 
  -o -name "*.old" 
  -o -name "*.tmp" 
  -o -name "*.swp" 
  -o -name "*~" 
  -o -name "*.dpkg-old" 
  -o -name "*.dpkg-dist" 
  -o -name "*.rpmnew" 
  -o -name "*.rpmsave" 
) 2>/dev/null

Bu komut /etc, /home ve /var/www altındaki tüm yedek dosyalarını listeler. Büyük bir sunucuda bu komutu ilk çalıştırdığınızda çıkan listeye bakınca insanın içi burkuluyor, inanın.

Boyut Bilgisiyle Birlikte Listelemek

Hangi dosyaların ne kadar yer kapladığını görmek için:

find /etc /home /var/www -type f ( 
  -name "*.bak" -o -name "*.orig" -o -name "*.old" 
  -o -name "*.tmp" -o -name "*~" 
) -exec ls -lh {} ; 2>/dev/null | sort -k5 -rh

Bu komut dosyaları boyutlarına göre büyükten küçüğe sıralar. Hangi dosyanın en fazla yer kapladığını böyle görürsünüz.

Toplam Disk Kullanımını Hesaplamak

Temizlik yapmadan önce ne kadar yer kazanacağınızı bilmek motivasyon açısından faydalıdır:

find /etc /home /var/www -type f ( 
  -name "*.bak" -o -name "*.orig" -o -name "*.old" 
  -o -name "*.tmp" -o -name "*~" -o -name "*.dpkg-old" 
  -o -name "*.rpmsave" -o -name "*.rpmnew" 
) -print0 2>/dev/null | du -ch --files0-from=- | tail -1

Editör Artıklarını Ele Almak

Vim Swap Dosyaları

Vim, bir dosya düzenlenirken sistem çöker ya da oturum kapanırsa veriyi kurtarmak için swap dosyaları oluşturur. Normal şartlarda kapanışta bu dosyaları siler ama beklenmedik kapanışlarda kalırlar.

# Vim swap dosyalarını bul
find / -name "*.swp" -o -name "*.swo" -o -name "*.swn" 2>/dev/null

# Sadece /etc altında ara (daha güvenli)
find /etc -name ".*.swp" -type f 2>/dev/null

Swap dosyalarını silmeden önce dikkatli olun. Hala açık bir editör oturumu varsa, o dosyayı kapatıp vim’in kendi temizlemesine izin verin. Açık oturum olmadığından eminseniz silebilirsiniz.

Emacs ve Nano Yedekleri

# Emacs tilde yedekleri
find /home -name "*~" -type f 2>/dev/null

# Nano yedekleri (.save uzantısıyla)
find /tmp /home -name "*.save" -type f 2>/dev/null

Paket Yöneticisi Artıklarını Bulmak

Bu kısım özellikle dikkat ister. .rpmnew ve .dpkg-dist dosyaları çoğunlukla paket güncellemesiyle gelen yeni konfigürasyon önerilerini içerir. Bunları körce silmek yerine önce mevcut konfigürasyonunuzla karşılaştırmalısınız.

Debian/Ubuntu Sistemlerde

# dpkg artıklarını bul
find /etc -name "*.dpkg-old" -o -name "*.dpkg-dist" 
  -o -name "*.dpkg-new" -o -name "*.dpkg-bak" 2>/dev/null

# Daha kapsamlı bir liste için
dpkg -l | grep -v "^ii" | grep -v "^|" | grep -v "^+" | grep -v "^Desired"

RHEL/CentOS/Rocky Linux Sistemlerde

# RPM artıklarını bul
find /etc -name "*.rpmnew" -o -name "*.rpmsave" -o -name "*.rpmorig" 2>/dev/null

Bu dosyalardan birini bulduğunuzda yapmanız gereken şey şu:

# Fark nedir, görelim
diff /etc/ssh/sshd_config /etc/ssh/sshd_config.rpmnew

# Ya da daha okunabilir bir format için
diff -u /etc/ssh/sshd_config /etc/ssh/sshd_config.rpmnew | less

Farkları inceledikten sonra ya yeni değişiklikleri mevcut konfigürasyonunuza elle entegre edersiniz ya da dosyayı tamamen silersiniz. Asla “bakacağım” deyip ertelemeyin, üç ay sonra unutursunuz.

Güvenli Temizleme Stratejileri

Önce Kuru Çalıştırma (Dry Run)

Hiçbir zaman direkt silme komutuyla başlamayın. Önce neyi sileceğinizi görün:

# Önce listele, sonra karar ver
find /home -name "*.bak" -type f -mtime +30 2>/dev/null -print

-mtime +30: 30 günden eski dosyalar. Bu parametre çok önemlidir; geçen hafta aldığınız yedeği yanlışlıkla silmek istemezsiniz.

Temizlik Öncesi Arşiv Oluşturmak

Paranoid olmak bu işin doğasında var. Silmeden önce arşivleyin:

# Silinecek dosyaları önce bir arşive al
find /etc -name "*.bak" -o -name "*.orig" -type f 2>/dev/null | 
  tar czf /root/backup_leftovers_$(date +%Y%m%d).tar.gz --files-from=-

# Arşiv oluştuysa ve sağlamsa, asıl silme işlemi
find /etc -name "*.bak" -o -name "*.orig" -type f -mtime +7 -delete 2>/dev/null

find ile Güvenli Silme

# 60 günden eski tüm yedek uzantılı dosyaları sil
find /home /var/www /etc -type f ( 
  -name "*.bak" 
  -o -name "*.old" 
  -o -name "*.tmp" 
  -o -name "*~" 
) -mtime +60 -print -delete 2>/dev/null

-print -delete kombinasyonunu kullanın: hem ne sildiğini göstersin hem de silsin. Böylece işlem logunuz olur.

xargs ile Toplu Silme

Çok fazla dosya varsa find ... -delete yerine xargs kullanmak daha verimli olabilir:

find /tmp -name "*.tmp" -type f -mtime +1 -print0 2>/dev/null | 
  xargs -0 -I {} rm -v {}

-print0 ve -0 kombinasyonu, dosya adlarında boşluk veya özel karakter olsa bile doğru çalışır. Bu detayı atlayan scriptler beklenmedik şekilde başka dosyaları silebilir.

Denetim Scripti Yazmak

Tek seferlik temizlik yetmez. Düzenli çalışan bir denetim mekanizması kurmanız gerekiyor. İşte basit ama işlevsel bir script:

#!/bin/bash
# yedek_denetim.sh
# Yedek dosyaları denetler, raporlar ve opsiyonel olarak temizler

ARAMA_DIZINLERI="/etc /home /var/www /opt"
LOG_DOSYASI="/var/log/yedek_denetim.log"
RAPOR_DOSYASI="/tmp/yedek_rapor_$(date +%Y%m%d_%H%M%S).txt"
SILME_ESIGI=30  # Kaç günden eski dosyalar silinsin

{
  echo "=== Yedek Dosya Denetim Raporu ==="
  echo "Tarih: $(date)"
  echo "Tarayan sunucu: $(hostname)"
  echo ""

  echo "--- Bulunan Yedek Dosyalar ---"
  TOPLAM=0
  while IFS= read -r -d '' dosya; do
    boyut=$(du -sh "$dosya" 2>/dev/null | cut -f1)
    tarih=$(stat -c "%y" "$dosya" 2>/dev/null | cut -d' ' -f1)
    echo "[$tarih] [$boyut] $dosya"
    TOPLAM=$((TOPLAM + 1))
  done < <(find $ARAMA_DIZINLERI -type f ( 
    -name "*.bak" -o -name "*.orig" -o -name "*.old" 
    -o -name "*.tmp" -o -name "*~" 
    -o -name "*.dpkg-old" -o -name "*.rpmsave" 
  ) -print0 2>/dev/null)

  echo ""
  echo "Toplam bulunan dosya: $TOPLAM"

  echo ""
  echo "--- $SILME_ESIGI Gunden Eski Dosyalar (Silinecek) ---"
  find $ARAMA_DIZINLERI -type f ( 
    -name "*.bak" -o -name "*.orig" -o -name "*.old" 
    -o -name "*~" -o -name "*.dpkg-old" 
  ) -mtime +$SILME_ESIGI -print 2>/dev/null

} | tee "$RAPOR_DOSYASI" >> "$LOG_DOSYASI"

echo "Rapor olusturuldu: $RAPOR_DOSYASI"

Bu scripti cron’a ekleyin:

# Her Pazar gece yarısı çalıştır
echo "0 0 * * 0 root /usr/local/bin/yedek_denetim.sh" >> /etc/cron.d/yedek-denetim

locate ile Hızlı Arama

find kapsamlı ama yavaş olabilir. Geniş sistemlerde hızlı bir ilk tarama için locate kullanabilirsiniz:

# locate veritabanını güncelle
updatedb

# Hızlı arama
locate "*.bak" | grep -v "^/proc" | grep -v "^/sys"
locate "*.rpmnew"
locate "*.dpkg-old"

locate veritabanı anlık değil, günlük güncellenir. Yeni oluşturulan dosyalar için find kullanmak daha güvenilirdir.

/tmp ve /var/tmp Özel Durumu

Bu dizinler ayrı bir kategori oluşturur. Pek çok uygulama buraya geçici dosya atar ve genellikle temizlemez.

# /tmp altındaki eski geçici dosyaları bul
find /tmp -type f -atime +7 -print 2>/dev/null

# /var/tmp daha uzun süreli geçici dosyalar için, daha uzun eşik
find /var/tmp -type f -atime +30 -print 2>/dev/null

# /tmp'yi temizlemek için (açık dosyaları atla)
find /tmp -type f -atime +7 ! -exec fuser {} ; -delete 2>/dev/null

fuser komutu dosyanın şu anda herhangi bir process tarafından kullanılıp kullanılmadığını kontrol eder. Kullanan varsa silme işlemi atlanır.

sed -i Kullanımında Dikkat

Çok yaygın bir senaryo: sed -i.bak ile konfigürasyon değişikliği yapıyorsunuz ve onlarca .bak birikiyoruz. Bunu önlemenin iki yolu var:

Ya yedek uzantısı kullanmayın (değişiklikten önce elle yedek alın):

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.$(date +%Y%m%d)
sed -i 's/worker_processes 1/worker_processes 4/' /etc/nginx/nginx.conf

Ya da hemen temizleyin:

sed -i.bak 's/eski_deger/yeni_deger/' /etc/uygulama/config.conf
# Test et, çalışıyorsa sil
systemctl restart uygulama && rm /etc/uygulama/config.conf.bak

İkinci yaklaşımda “çalışıyorsa sil” adımını bir if bloğuna alabilirsiniz:

sed -i.bak 's/eski_port/8080/' /etc/app/config.conf
if systemctl restart myapp 2>/dev/null; then
  rm -f /etc/app/config.conf.bak
  echo "Değişiklik başarılı, yedek silindi"
else
  mv /etc/app/config.conf.bak /etc/app/config.conf
  echo "Hata oluştu, yedek geri yüklendi"
fi

Git ile Konfigürasyon Yönetimi

Uzun vadeli çözüm olarak /etc dizinini git ile yönetmek bu tür birikimleri büyük ölçüde önler. etckeeper bu iş için özel geliştirilmiş bir araçtır:

apt install etckeeper    # Debian/Ubuntu
yum install etckeeper    # RHEL/CentOS

etckeeper init
etckeeper commit "Ilk commit"

etckeeper kurulduktan sonra paket kurulumu veya güncellemesi sırasında /etc değişikliklerini otomatik commit’ler. Manuel yedek alma ihtiyacı büyük ölçüde ortadan kalkar ve o .bak birikintisinden kurtulursunuz.

Sonuç

Yedek dosya birikimi kulağa küçük bir sorun gibi gelir ama üretim ortamlarında gereksiz disk tüketiminin, bazen de konfigürasyon karmaşasının önemli bir kaynağıdır. .rpmnew veya .dpkg-dist dosyalarının fark edilmemesi, kritik güvenlik güncellemelerinin uygulanmaması anlamına gelebilir.

Önerim şu: Bugün /etc dizininde bir find komutu çalıştırın ve çıktıya bakın. Büyük ihtimalle şaşıracaksınız. Sonra bir temizlik scripti yazın, cron’a ekleyin ve etckeeper gibi bir araçla konfigürasyonlarınızı versiyon kontrolüne alın. Bu üç adım, bu konuya bir daha dönmenizi büyük ölçüde önler.

Diskiniz ve gelecekteki kendiniz size teşekkür edecek.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir