Arşiv Oluştururken Hariç Tutulacak Dosya ve Klasörleri Belirleme: exclude Seçenekleri

Yıllarca sistem yöneticiliği yapan herkesin er ya da geç öğrendiği bir gerçek var: iyi bir yedekleme stratejisi, neyi yedeklediğin kadar neyi yedeklemediğinle de ilgilidir. Gereksiz dosyaları arşivlere dahil etmek hem depolama alanını boşa harcar hem de yedekten geri dönme süreçlerini uzatır. Bu yazıda tar, zip ve rsync gibi araçların --exclude seçeneklerini gerçek dünya senaryolarıyla ele alacağız.

Neden Exclude Önemli?

Düşünün: bir uygulama sunucusunda /var/www dizinini yedekliyorsunuz. Dizinin içinde node_modules klasörü var, geçici log dosyaları var, önbellek dizinleri var. Bu klasörleri dahil ettiğinizde belki 2 GB’lık bir arşiv oluşturuyor. Bunları dışarıda bıraktığınızda aynı arşiv 180 MB’a düşüyor. Bu sadece depolama meselesi değil; aynı zamanda arşiv aktarım süresi, CPU kullanımı ve geri yükleme hızı meselesi.

Bir de şunu düşünün: geliştirici ortamlarında .git klasörü içinde yüzlerce megabaytlık nesne deposu bulunabilir. Bunu yanlışlıkla production yedeğine dahil etmek hem gereksiz hem de potansiyel olarak tehlikeli.

tar ile –exclude Kullanımı

tar komutu, Linux sistemlerinde arşivleme işlemlerinin bel kemiğidir. --exclude seçeneği hem tekil dosya hem de dizin hem de glob desenleri için çalışır.

Temel Sözdizimi

tar -czvf arsiv.tar.gz --exclude='desen' kaynak_dizin/

Burada dikkat edilmesi gereken önemli bir nokta: --exclude seçeneği kaynak_dizin/ argümanından önce gelmelidir. Sonra yazarsanız çalışmaz.

Tekil Dosya veya Dizin Hariç Tutma

# node_modules dizinini hariç tut
tar -czvf proje_yedek.tar.gz --exclude='./node_modules' /var/www/uygulama/

# Birden fazla dizini hariç tut
tar -czvf proje_yedek.tar.gz 
  --exclude='./node_modules' 
  --exclude='./.git' 
  --exclude='./tmp' 
  --exclude='./cache' 
  /var/www/uygulama/

Her --exclude ifadesini ayrı satırda yazmak hem okunabilirliği artırır hem de hata ayıklamayı kolaylaştırır. Özellikle script yazarken bu alışkanlığı edinmenizi öneririm.

Glob Desenleriyle Çalışma

# Tüm .log dosyalarını hariç tut
tar -czvf sistem_yedek.tar.gz 
  --exclude='*.log' 
  --exclude='*.tmp' 
  --exclude='*.swp' 
  /etc/ /home/

# Belirli bir uzantıyı alt dizinlerde de hariç tut
tar -czvf web_yedek.tar.gz 
  --exclude='**/*.pyc' 
  --exclude='**/__pycache__' 
  /var/www/django_app/

** deseni GNU tar’da çalışır ancak bazı eski sistemlerdeki tar sürümlerinde sorun çıkarabilir. Emin olmak için test edin.

–exclude-from Seçeneği: Liste Dosyasından Okuma

Hariç tutulacak çok sayıda desen varsa bunları bir dosyaya yazıp --exclude-from ile okutmak çok daha temiz bir yaklaşım.

# exclude_list.txt içeriği:
# node_modules
# .git
# *.log
# *.tmp
# __pycache__
# .cache
# vendor/

tar -czvf uygulama_yedek.tar.gz 
  --exclude-from=/root/exclude_list.txt 
  /var/www/

Bu yöntemin gerçek avantajı şu: exclude listesini versiyon kontrol sistemine ekleyebilir, farklı yedekleme scriptlerinizde aynı listeyi kullanabilir ve listeyi merkezi olarak yönetebilirsiniz. Beş farklı sunucuda çalışan yedekleme scriptleriniz varsa ve hepsine aynı exclude kurallarını uygulamanız gerekiyorsa, bu listeyi bir config sunucusundan çekerek senkron tutabilirsiniz.

–exclude-vcs: Versiyon Kontrol Sistemlerini Otomatik Hariç Tutma

# .git, .svn, .hg gibi VCS dizinlerini otomatik hariç tut
tar -czvf kod_yedek.tar.gz 
  --exclude-vcs 
  /home/developer/projeler/

Bu bayrak özellikle geliştirici ortamlarını arşivlerken çok kullanışlı. Tek komutla .git, .svn, .hg, .bzr gibi tüm yaygın versiyon kontrol dizinlerini atlıyor.

zip Komutu ile Exclude Kullanımı

zip komutunun exclude sözdizimi tar’dan biraz farklı çalışır ve bazı tuzaklar içerir.

# Temel exclude kullanımı
zip -r arsiv.zip kaynak_dizin/ -x "kaynak_dizin/node_modules/*"

# Birden fazla pattern
zip -r web_arsiv.zip /var/www/site/ 
  -x "*/node_modules/*" 
  -x "*/.git/*" 
  -x "*/tmp/*" 
  -x "*.log" 
  -x "*.pyc"

zip ile çalışırken en sık yapılan hata, * karakterini tırnak içine almamak. Shell bu karakteri expand ediyor ve beklenmedik sonuçlar ortaya çıkıyor. Her zaman tırnak içine alın.

# YANLIS - shell expand eder
zip -r arsiv.zip /var/www/ -x *.log

# DOGRU - tırnaklar shell expansion'ı engeller
zip -r arsiv.zip /var/www/ -x "*.log"

zip ile Exclude Listesi Kullanımı

# exclude.lst dosyası oluştur
cat > /tmp/exclude.lst << 'EOF'
*/node_modules/*
*/.git/*
*/vendor/*
*.log
*.tmp
*/__pycache__/*
*/cache/*
EOF

# Liste dosyasıyla zip oluştur
zip -r proje_arsiv.zip /var/www/proje/ -x@/tmp/exclude.lst

-x@dosya sözdizimi pek bilinmez ama son derece kullanışlıdır.

rsync ile Exclude: Arşivlemenin Ötesinde

rsync teknik olarak bir arşiv aracı değil ama yedekleme ve senkronizasyon süreçlerinde sıkça kullanılıyor ve exclude mekanizması oldukça güçlü.

# Temel rsync exclude
rsync -avz --exclude='node_modules' 
  --exclude='.git' 
  --exclude='*.log' 
  /var/www/uygulama/ backup_server:/yedekler/uygulama/

# exclude-from ile
rsync -avz --exclude-from='/etc/backup/exclude.conf' 
  /var/www/ backup_server:/yedekler/www/

rsync’te --exclude ve --include birlikte kullanılabilir ve sıralama önemlidir. İlk eşleşen kural uygulanır.

# Sadece .php ve .html dosyalarını yedekle, diğer her şeyi hariç tut
rsync -avz 
  --include='*/' 
  --include='*.php' 
  --include='*.html' 
  --exclude='*' 
  /var/www/site/ /yedekler/site/

Bu pattern özellikle büyük dizin yapılarında sadece belirli dosya tiplerini seçip yedeklemek istediğinizde kullanışlı.

Gerçek Dünya Senaryoları

Senaryo 1: WordPress Sitesi Yedekleme

Tipik bir WordPress kurulumunda yedeklemeniz gereken şeyler: PHP dosyaları, temalar, eklentiler, yüklemeler. Yedeklemenize gerek olmayanlar: önbellek dosyaları, geçici yükleme klasörleri, log dosyaları.

#!/bin/bash
TARIH=$(date +%Y%m%d_%H%M%S)
SITE_DIZIN="/var/www/wordpress"
YEDEK_DIZIN="/backup/wordpress"

tar -czvf "${YEDEK_DIZIN}/wp_yedek_${TARIH}.tar.gz" 
  --exclude='./wp-content/cache' 
  --exclude='./wp-content/uploads/wp-smushit' 
  --exclude='./wp-content/wflogs' 
  --exclude='./wp-content/debug.log' 
  --exclude='*.tmp' 
  --exclude='*.log' 
  -C "${SITE_DIZIN}" .

echo "Yedek tamamlandi: wp_yedek_${TARIH}.tar.gz"

-C ile dizin değiştirip . kullanmak, arşiv içinde tam path yerine göreceli path elde etmenizi sağlar. Geri yüklemesi çok daha kolay.

Senaryo 2: Node.js Uygulama Yedekleme

#!/bin/bash
# Node.js uygulaması için akıllı yedekleme

APP_PATH="/opt/node_apps/api_servisi"
BACKUP_PATH="/nas/backups/node_apps"
TIMESTAMP=$(date +%Y%m%d)

# Arşiv boyutunu önce tahmin et
echo "Tahmini arşiv boyutu (exclude olmadan):"
du -sh "${APP_PATH}"

tar -czvf "${BACKUP_PATH}/api_servisi_${TIMESTAMP}.tar.gz" 
  --exclude='./node_modules' 
  --exclude='./.git' 
  --exclude='./logs' 
  --exclude='./tmp' 
  --exclude='./.env' 
  --exclude='./coverage' 
  --exclude='./.nyc_output' 
  -C "${APP_PATH}" .

echo "Olusturulan arşiv boyutu:"
du -sh "${BACKUP_PATH}/api_servisi_${TIMESTAMP}.tar.gz"

.env dosyasını exclude listesine eklemek önemli. Production ortamında veritabanı şifreleri, API anahtarları gibi hassas bilgiler burada olur ve bunları yanlış yere yedeklemek ciddi güvenlik riski oluşturabilir.

Senaryo 3: Ev Dizini Yedekleme (Birden Fazla Kullanıcı)

#!/bin/bash
# /home dizini için toplu yedekleme

YEDEK_DIZIN="/mnt/nas/home_yedek"
TARIH=$(date +%Y-%m-%d)

cat > /tmp/home_exclude.txt << 'EOF'
.cache
.local/share/Trash
.local/share/recently-used.xbel
Downloads/
.mozilla/firefox/*/Cache
.config/google-chrome/Default/Cache
*.pyc
__pycache__
.npm
.yarn/cache
EOF

for KULLANICI in $(ls /home/); do
  if [ -d "/home/${KULLANICI}" ]; then
    echo "Yedekleniyor: ${KULLANICI}"
    tar -czvf "${YEDEK_DIZIN}/${KULLANICI}_${TARIH}.tar.gz" 
      --exclude-from=/tmp/home_exclude.txt 
      -C /home "${KULLANICI}/"
  fi
done

Exclude Kurallarında Sık Yapılan Hatalar

Path Göreceliği Sorunu

# Bu calisir - göreceli path
tar -czvf arsiv.tar.gz --exclude='./node_modules' /var/www/proje/

# Bu da calisir
tar -czvf arsiv.tar.gz --exclude='node_modules' /var/www/proje/

# Bu CALISMAYABILIR - tam path verme
tar -czvf arsiv.tar.gz --exclude='/var/www/proje/node_modules' /var/www/proje/

Tam path vermek bazen çalışmaz çünkü tar arşiv içindeki path ile eşleştirme yapar, dosya sistemindeki tam path ile değil. Bu yüzden göreceli pattern kullanmak daha güvenli.

Trailing Slash Sorunu

# Sadece bu isimde dizinleri hariç tutar
tar -czvf arsiv.tar.gz --exclude='tmp' /var/www/

# Hem dosya hem dizinleri hariç tutar
tar -czvf arsiv.tar.gz --exclude='tmp/' /var/www/

Sonundaki / farkı önemli. tmp/ yazdığınızda sadece tmp adlı dizinleri dışarıda bırakırsınız. tmp yazdığınızda hem tmp adlı dosyaları hem de tmp adlı dizinleri dışarıda bırakırsınız.

Exclude Listesi Yönetimi için İpuçları

Exclude listelerini merkezi olarak yönetmek, özellikle birden fazla sunucu veya farklı proje tiplerini yedeklediğinizde hayat kurtarır.

# /etc/backup/ altında organize edin
/etc/backup/
  ├── exclude_nodejs.conf
  ├── exclude_python.conf
  ├── exclude_wordpress.conf
  └── exclude_genel.conf

# Genel + projeye özel birleştirme
cat /etc/backup/exclude_genel.conf /etc/backup/exclude_nodejs.conf > /tmp/combined_exclude.conf
tar -czvf arsiv.tar.gz --exclude-from=/tmp/combined_exclude.conf /var/www/

Ortak bir exclude_genel.conf dosyası oluşturup bunu her yedekleme scriptine dahil etmek, tutarlılık sağlar. .log, .tmp, *.swp, .DS_Store gibi her zaman hariç tutmak istediğiniz şeyleri buraya koyun.

Arşiv Oluşturmadan Önce Test Etme

Exclude kurallarını uygulamadan önce ne hariç tutulacağını görmek için dry-run benzeri bir yaklaşım kullanabilirsiniz:

# -t (list) ile arşiv içeriğini göster, oluşturma
tar -czvf /dev/null 
  --exclude='./node_modules' 
  --exclude='*.log' 
  -C /var/www/proje . 2>&1 | head -50

# Kaç dosya dahil edileceğini say
tar -czvf /dev/null 
  --exclude='./node_modules' 
  -C /var/www/proje . 2>&1 | wc -l

/dev/null‘a yazmak gerçekten arşiv oluşturmadan tüm süreci simüle eder. Böylece hangi dosyaların dahil edildiğini görebilir, exclude kurallarınızın doğru çalışıp çalışmadığını test edebilirsiniz.

Sonuç

Arşivleme işlemlerinde exclude kullanımı, hem yer hem zaman hem de kaynak tasarrufu açısından kritik. Bu yazıda ele aldığımız temel noktaları özetlersek:

  • tar için --exclude, --exclude-from ve --exclude-vcs seçenekleri farklı senaryolara uygun araçlar sunar
  • zip ile exclude kullanırken pattern’leri mutlaka tırnak içine alın, aksi halde shell expansion beklenmedik sonuçlar doğurur
  • rsync ile --include ve --exclude birlikte kullanılabilir, sıralama kritiktir
  • Exclude listelerini dosyalara yazıp --exclude-from ile okutmak, tekrar kullanılabilirlik ve bakım kolaylığı sağlar
  • Arşiv oluşturmadan önce /dev/null‘a yazarak test etmek, hataları önceden yakalamanızı sağlar
  • .env ve benzeri hassas dosyaları her zaman exclude listesine ekleyin

Yedekleme scriptlerinizi yazarken “ne yedeklemeliyim?” sorusunu sorduktan hemen sonra “ne yedeklememem gerekiyor?” sorusunu da sorun. Bu ikinci sorunun cevabı, arşivlerinizi daha küçük, daha hızlı ve daha güvenli hale getirecektir.

Bir yanıt yazın

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