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.
