zip Komutu ile Dosya Sikistirma ve ZIP Arsivi Olusturma

Linux sistemlerde zip komutu, dosya ve dizinleri ZIP formatinda sikistirarak arsivlemenizi saglar. Yedekleme, transfer ve depolama islemlerinde sikca kullanilan bu komutun temel ve ileri duzey kullanim sekillerini bu yazida bulabilirsiniz.

zip Komutu: Dosya Sıkıştırma ve ZIP Arşivi Oluşturma

Sysadmin hayatında sıkıştırma işlemleri kaçınılmaz. Log dosyalarını arşivleyeceksin, backup alacaksın, müşteriye bir şeyler göndereceksin ya da disk alanı kurtarmak için eski dosyaları paketleyeceksin. Linux dünyasında tar.gz daha yaygın olsa da, zip formatı özellikle Windows ile iletişimde, web sunucularında ve cross-platform senaryolarda hala birinci tercih. Bu yazıda zip komutunu her açıdan inceliyoruz.

zip Nedir ve Neden Hala Kullanılır?

zip, hem sıkıştırma hem de arşivleme işlemini tek adımda yapan bir format ve araçtır. tar gibi önce arşivleyip sonra sıkıştırma yapmaz, her dosyayı ayrı ayrı sıkıştırır. Bu yaklaşımın avantajı şudur: arşivden tek bir dosyayı çıkarmak istediğinde tüm arşivi açmak zorunda kalmazsın.

zip kullanmak isteyeceğin durumlar:

  • Windows kullanıcılarına dosya göndermek
  • Web uygulamalarında kullanıcıya download sunmak
  • Farklı işletim sistemleri arasında dosya transferi
  • Script ile otomatik backup oluşturmak
  • E-posta ekinde dosya göndermek (bazı mail sunucuları tar.gz’yi engeller)

Kurulum

Çoğu sistemde zip zaten yüklü gelir ama gelmiyorsa:

# Debian/Ubuntu
sudo apt install zip unzip

# RHEL/CentOS/Rocky Linux
sudo dnf install zip unzip

# Arch Linux
sudo pacman -S zip unzip

# macOS (Homebrew)
brew install zip

unzip paketini de mutlaka kur, arşivleri açmak için lazım olacak.

Temel Kullanım

Basit Arşiv Oluşturma

En temel kullanım şu şekilde:

# Tek dosyayı sıkıştır
zip arsiv.zip dosya.txt

# Birden fazla dosyayı sıkıştır
zip arsiv.zip dosya1.txt dosya2.txt dosya3.log

# Wildcard kullanarak belirli uzantıdaki dosyaları sıkıştır
zip arsiv.zip *.txt
zip logs.zip *.log

Burada dikkat etmen gereken şey: zip komutu, arşiv adını ilk argüman olarak alır. Varolan bir arşiv ismi verirsen, dosyaları o arşive ekler, üzerine yazmaz. Bu davranışı bilmeden bazen şaşırabilirsin.

Klasör Sıkıştırma (Recursive)

Bir klasörü tüm içeriğiyle sıkıştırmak için -r (recursive) parametresini kullanman gerekiyor:

# Klasörü sıkıştır
zip -r proje.zip /home/ahmet/proje/

# Mevcut dizini sıkıştır
zip -r backup.zip .

# Birden fazla klasörü birleştir
zip -r arsiv.zip klasor1/ klasor2/ dosya.txt

-r parametresini unutmak sık yapılan hatalardan biridir. Unutursan zip sadece boş klasörü ekler, içindeki dosyaları dahil etmez. Bunu fark etmeden backup aldığını sanan sysadmin’lere çok rastladım.

Sıkıştırma Seviyeleri

zip 0’dan 9’a kadar sıkıştırma seviyesi destekler. Varsayılan seviye 6’dır.

# Sıkıştırma yok, sadece arşivle (en hızlı)
zip -0 arsiv.zip dosyalar/

# Varsayılan sıkıştırma (seviye 6)
zip arsiv.zip dosyalar/

# Maksimum sıkıştırma (en yavaş, en küçük boyut)
zip -9 -r arsiv.zip dosyalar/

# Hızlı ama düşük sıkıştırma (seviye 1)
zip -1 -r hizli-backup.zip /var/log/

Pratik tavsiye: Log dosyaları gibi text tabanlı dosyalar için -9 seviyesi fark yaratır, %60-70 tasarruf sağlayabilirsin. Ama zaten sıkıştırılmış dosyalar için (jpg, mp4, gz) yüksek seviye zaman kaybından başka bir şey değildir.

Gercek Dunya Senaryosu 1: Web Sitesi Backup

Bir web sunucusunda çalışıyorsun ve her gece siteyi backup almak istiyorsun. Şöyle bir script yazabilirsin:

#!/bin/bash

# Web sitesi backup scripti
SITE_DIR="/var/www/html/sirketim.com"
BACKUP_DIR="/backup/web"
TARIH=$(date +%Y%m%d_%H%M%S)
BACKUP_DOSYA="$BACKUP_DIR/sirketim_$TARIH.zip"

# Backup dizini yoksa oluştur
mkdir -p $BACKUP_DIR

# Sıkıştır, log dosyalarını ve cache'i hariç tut
zip -r -9 $BACKUP_DOSYA $SITE_DIR 
    --exclude="$SITE_DIR/wp-content/cache/*" 
    --exclude="$SITE_DIR/wp-content/uploads/wpcf7_captcha/*" 
    --exclude="*.log" 
    --exclude="*.tmp"

# Sonucu kontrol et
if [ $? -eq 0 ]; then
    echo "Backup basarili: $BACKUP_DOSYA"
    # 30 gunden eski backuplari sil
    find $BACKUP_DIR -name "*.zip" -mtime +30 -delete
else
    echo "HATA: Backup basarisiz!" >&2
    exit 1
fi

Bu scripti crontab’a ekle:

# Her gece 02:30'da calistir
30 2 * * * /usr/local/bin/web-backup.sh >> /var/log/web-backup.log 2>&1

Dosya Hariç Tutma (Exclude)

Büyük arşivler oluştururken bazı dosya ve klasörleri hariç tutmak istersin. --exclude parametresi bunun için:

# Belirli uzantilari hariç tut
zip -r proje.zip /home/ahmet/proje/ --exclude="*.pyc" --exclude="*.log"

# Belirli klasoru hariç tut
zip -r proje.zip /home/ahmet/proje/ --exclude="/home/ahmet/proje/node_modules/*"

# Gizli dosyalari dahil et ama .git klasorunu hariç tut
zip -r deploy.zip . --exclude=".git/*" --exclude="*.pyc" --exclude="__pycache__/*"

# Birden fazla pattern'i liste dosyasindan oku
cat > exclude.lst << EOF
*.pyc
*.log
node_modules/*
.git/*
__pycache__/*
*.tmp
EOF

zip -r proje.zip /proje/ [email protected]

--exclude ile pattern kullanırken dikkatli ol. Pattern’lar wildcard içeriyorsa tırnak içine almalısın, yoksa shell genişletme yaparak beklenmedik sonuçlar verebilir.

Parola Korumalı Arşiv Oluşturma

Hassas dosyaları göndermen gerektiğinde şifreleme şart:

# Parola ile sıkıştır (parola sorulur)
zip -e gizli.zip hassas-dosyalar/

# Parola ile sıkıştır (AES-256 ile, daha güvenli)
zip -er --encryption=AES256 super-gizli.zip hassas-dosyalar/

# Script içinde parola ver (dikkat: komut geçmişinde gözükür!)
zip -P "gizliparola123" -r arsiv.zip dosyalar/

# Daha güvenli yontem: ortam degiskeni ile
ZIP_PASS="guclu_parola_burada"
echo "$ZIP_PASS" | zip -P "$ZIP_PASS" -r arsiv.zip dosyalar/
unset ZIP_PASS

Onemli uyari: Standart zip şifrelemesi (ZipCrypto) zayıftır. AES-256 kullanmak için zip -e yerine bazı sistemlerde 7z aracını tercih edebilirsin. Kritik veriler için mutlaka AES-256 kullan.

Arşiv Yönetimi: Guncelleme ve Düzenleme

Mevcut bir arşivi yönetmek için kullanışlı parametreler:

# Arşive yeni dosya ekle
zip mevcut.zip yeni-dosya.txt

# Arşivdeki degismiş dosyaları güncelle (-u update)
zip -u arsiv.zip *.txt

# Arşivden dosya sil (-d delete)
zip -d arsiv.zip gereksiz-dosya.txt

# Arşiv içindeki dosyaları listele
unzip -l arsiv.zip

# Daha detayli liste
unzip -v arsiv.zip

# Arşiv bütünlüğünü test et
zip -T arsiv.zip
# veya
unzip -t arsiv.zip

Gercek Dunya Senaryosu 2: Log Arşivleme

Büyük bir uygulamanın logları disk dolduruyor. Her ay sonunda logları sıkıştırıp arşivleyeceksin:

#!/bin/bash

# Log arsivleme scripti
LOG_DIR="/var/log/uygulama"
ARSIV_DIR="/arsiv/loglar"
GECEN_AY=$(date -d "1 month ago" +%Y%m)
DOSYA_ADI="logs_$GECEN_AY.zip"

mkdir -p $ARSIV_DIR

# Gecen aya ait log dosyalarını bul ve sıkıştır
find $LOG_DIR -name "*$GECEN_AY*.log" -type f | 
    zip -@ -9 "$ARSIV_DIR/$DOSYA_ADI"

if [ $? -eq 0 ]; then
    echo "Log arsivleme tamamlandi: $DOSYA_ADI"
    
    # Arsivlenen dosyaları dogrula
    unzip -t "$ARSIV_DIR/$DOSYA_ADI" > /dev/null 2>&1
    
    if [ $? -eq 0 ]; then
        echo "Arsiv dogrulandı, orijinal loglar siliniyor..."
        # Dogrulama basariliysa orijinal dosyalari sil
        find $LOG_DIR -name "*$GECEN_AY*.log" -type f -delete
    else
        echo "HATA: Arsiv bozuk, dosyalar silinmedi!" >&2
    fi
else
    echo "HATA: Arsivleme basarisiz!" >&2
    exit 1
fi

Bu scriptte dikkat etmem istediğim bir şey var: her zaman arşivi doğrula, sonra orijinali sil. Bu adımı atlayan sysadmin’lerin yaptığı hatayı düzeltmek için harcanan zamanı bir düşün.

Bolünmüş Arşivler (Split Archives)

Büyük dosyaları belirli boyutlarda bölerek arşivlemek gerektiğinde, mesela e-posta ekinde gönderirken ya da FAT32 gibi 4GB sınırı olan bir sisteme kopyalarken:

# 100MB'lik parcalara bol
zip -r -s 100m buyuk-arsiv.zip buyuk-klasor/

# 700MB'lik parcalara bol (CD boyutu)
zip -r -s 700m cd-arsivleri.zip veriler/

# Sonucta soyle dosyalar olusur:
# buyuk-arsiv.z01
# buyuk-arsiv.z02
# buyuk-arsiv.zip (son parca)

# Birleştirip acmak icin:
zip -FF buyuk-arsiv.zip --out tum-arsiv.zip
unzip tum-arsiv.zip

Pratik Ipuclari ve Sik Yapilan Hatalar

Ipuclari:

  • Büyük dizinleri sıkıştırırken -v parametresiyle ilerlemeyi takip edebilirsin
  • -j parametresi ile klasör yapısını düzleştirebilirsin (junk paths), tüm dosyalar kök dizinde toplanır
  • Pipe ile kullanmak için - (stdin/stdout) kullanabilirsin
# Ilerlemeyi goster
zip -r -v arsiv.zip buyuk-klasor/ 2>&1 | grep "adding:"

# Klasor yapisini duzlestir, tum dosyalar kok dizinde
zip -r -j duz-arsiv.zip /var/www/html/img/

# Komut ciktisini dogrudan zip'le
ps aux | zip -@ islemler.zip

# tar ile birlikte kullanım (nadiren de olsa lazim olur)
tar cf - /veri/ | zip -9 - > veri-arsiv.zip

Sik Yapilan Hatalar:

  • -r unutmak ve klasör içeriğinin arşivlenmediğini anlamamak
  • --exclude pattern’larını tırnak içine almamak
  • Arşivi doğrulamadan orijinal dosyaları silmek
  • Zaten sıkıştırılmış dosyaları tekrar yüksek seviyede sıkıştırmaya çalışmak

zip vs tar.gz: Hangisini Kullanmalısın?

| Durum | Tercih | |——-|——–| | Windows ile paylaşım | zip | | Linux sunucu backup | tar.gz | | Web’den download | zip | | Büyük dosya transferi | tar.gz veya tar.bz2 | | Script ile tek dosya açma | zip | | Maksimum sıkıştırma oranı | tar.xz veya 7z |

Sonuç

zip komutu, sysadmin araç kutusunda her zaman olması gereken temel bir araç. Windows ortamlarıyla konuşuyorsun, web uygulamalarına dosya sunuyorsun ya da sadece hızlıca bir arşiv oluşturman gerekiyor, zip işini görüyor.

Özellikle dikkat etmen gereken noktalar:

  • Recursive işlemler için -r şart, unutma
  • Hassas veriler için AES-256 şifreleme kullan
  • Arşivi sil silmeden önce her zaman doğrula (unzip -t)
  • Büyük arşivlerde sıkıştırma seviyesini duruma göre ayarla
  • Otomatik scriptlerde her zaman hata kontrolü yap

Backup ve arşivleme işlemleri sıkıcı görünür ama sisteminin can sigortasıdır. zip ile yazacağın düzgün bir backup scripti, ileride seni çok büyük bir dertten kurtarabilir. Buna söz veriyorum.

Bir yanıt yazın

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