zip ve unzip: Çapraz Platform Arşivleme Rehberi

Windows kullanıcısından zip dosyası geldi, Linux sunucunda açman gerekiyor. Ya da tam tersi, Linux’ta hazırladığın arşivi Windows’taki müşteriye göndereceksin. İşte bu noktada zip ve unzip komutları hayat kurtarıcı oluyor. Tar.gz her ne kadar Linux dünyasının vazgeçilmezi olsa da, çapraz platform uyumluluğu söz konusu olduğunda zip formatı hala kral. Bu yazıda zip ve unzip komutlarını her açıdan ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.

Neden zip Kullanmalısın?

Linux’ta tar komutu daha yaygın olsa da zip formatının ciddi avantajları var. Önce şunu netleştirelim: tar tek başına sıkıştırma yapmaz, sadece dosyaları bir araya toplar. Sıkıştırma için gzip veya bzip2 gerekir. Zip ise her ikisini de tek seferde yapar.

Daha da önemlisi, zip arşivleri rastgele erişim destekler. Yani 10 GB’lık bir zip arşivinde tek bir dosyaya erişmek istiyorsan, tüm arşivi açman gerekmez. Tar.gz’de ise arşiv sıralı okunduğundan bu mümkün değildir. Müşterilerle, Windows kullanıcılarıyla veya farklı işletim sistemleri arasında dosya paylaşırken zip kullanmak pratik ve güvenli bir seçimdir.

Kurulum

Çoğu Linux dağıtımında zip ve unzip önceden yüklü gelir ama gelmediği durumlar da olabiliyor:

# Debian/Ubuntu tabanlı sistemler
sudo apt update && sudo apt install zip unzip

# RHEL/CentOS/Fedora
sudo dnf install zip unzip

# Arch Linux
sudo pacman -S zip unzip

# Kurulu olup olmadığını kontrol etmek için
which zip unzip
zip --version

zip Komutu: Temel Kullanım

En basit haliyle zip kullanımı şöyle:

zip arsiv_adi.zip dosya1.txt dosya2.txt dosya3.txt

Bu komut üç dosyayı tek bir zip arşivine paketler. Şimdi daha işlevsel senaryolara bakalım.

Temel Parametreler

-r: Dizinleri özyinelemeli olarak arşivler. Bir klasörü ziplemek için şart.

-v: Ayrıntılı çıktı gösterir, hangi dosyaların eklendiğini görürsün.

-q: Sessiz mod, hiçbir çıktı göstermez. Script’lerde kullanışlı.

-9: Maksimum sıkıştırma oranı (yavaş ama küçük dosya).

-1: Minimum sıkıştırma oranı (hızlı ama büyük dosya).

-e: Arşive şifre koyar.

-u: Arşivi günceller, sadece değişen dosyaları ekler.

-d: Arşivden dosya siler.

-m: Dosyaları arşive ekledikten sonra orijinalleri siler (move).

-j: Dizin yapısını korumaz, sadece dosyaları alır.

-x: Belirtilen dosyaları hariç tutar.

-P: Şifre komut satırından verir (güvensiz, script’lerde dikkatli kullan).

-T: Arşiv bütünlüğünü test eder.

-F: Bozuk arşivi onarmaya çalışır.

Dizin Arşivleme

# Bir dizini tüm içeriğiyle arşivle
zip -r proje.zip /home/ali/proje/

# Mevcut dizini arşivle
cd /home/ali/proje
zip -r ../proje_yedek.zip .

# Arşivleme sürecini takip et
zip -rv proje.zip /home/ali/proje/

Burada dikkat etmen gereken nokta: -r parametresi olmadan zip sadece boş klasörü arşive ekler, içindeki dosyaları almaz. Bu klasik bir hata ve herkese bir kez olur.

Gerçek Dünya Senaryosu 1: Web Sunucusu Yedeği

Diyelim ki bir müşterinin WordPress sitesini başka bir sunucuya taşıyorsun. Hem dosyaları hem de yapıyı koruman gerekiyor:

# Web dizinini yedekle
cd /var/www
zip -r /backup/wordpress_yedek_$(date +%Y%m%d).zip html/

# Belirli dosyaları hariç tutarak yedekle
zip -r /backup/site_yedek.zip html/ 
    -x "html/wp-content/cache/*" 
    -x "html/wp-content/uploads/2020/*" 
    -x "*.log"

# Arşiv boyutunu kontrol et
ls -lh /backup/wordpress_yedek_*.zip

$(date +%Y%m%d) ifadesi arşiv adına tarih ekliyor. Bu şekilde her gün farklı isimde yedek oluşur ve üzerine yazma sorunu yaşamazsın.

Sıkıştırma Seviyeleri

Zip 0’dan 9’a kadar sıkıştırma seviyeleri sunar:

# Sıkıştırma yok, sadece paketleme (en hızlı)
zip -0 arsiv.zip buyuk_dosya.iso

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

# Maksimum sıkıştırma (en yavaş, en küçük)
zip -9 arsiv.zip *.txt

# Hız öncelikli minimal sıkıştırma
zip -1 hizli_arsiv.zip *.log

Pratik bir not: Zaten sıkıştırılmış dosyalar için (jpg, mp4, mkv, pdf) yüksek sıkıştırma seviyesi kullanmak anlamsız. Bu tür dosyalar için -0 veya -1 tercih et, hem zaman kazanırsın hem de dosya boyutu neredeyse aynı kalır.

Şifreli Arşiv Oluşturma

Hassas verileri zip ile göndereceksen şifreleme şart:

# İnteraktif şifre girişi (güvenli yol)
zip -e gizli_dosyalar.zip veritabani_yedek.sql konfigürasyon.env

# Script içinde kullanmak için (dikkatli kullan!)
zip -P "güçlü_şifre_123" gizli.zip önemli_belge.pdf

# AES-256 şifreleme için (daha güvenli)
zip --encrypt -9 güvenli_arsiv.zip hassas_veriler/

Önemli uyarı: -P parametresiyle şifre komut satırında görünür ve bash geçmişine kaydolur. Gerçekten hassas veriler için -e parametresini kullan ve şifreyi interaktif olarak gir. Daha da iyisi, GPG kullan ama bu başka bir yazının konusu.

unzip Komutu: Detaylı Kullanım

Temel Parametreler

-l: Arşiv içeriğini listeler, dosyaları açmaz.

-v: Ayrıntılı liste, sıkıştırma oranlarını gösterir.

-t: Arşiv bütünlüğünü test eder.

-d: Hedef dizin belirtir.

-o: Mevcut dosyaların üzerine sormadan yazar.

-n: Mevcut dosyaları atlar, üzerine yazmaz.

-j: Dizin yapısını yoksayar, tüm dosyaları düz olarak çıkarır.

-p: Stdout’a çıktı verir, dosyaya yazmaz.

-P: Şifreyi komut satırından alır.

-q: Sessiz mod.

-x: Belirtilen dosyaları hariç tutarak çıkarır.

-f: Sadece mevcut dosyaları günceller, yeni dosya oluşturmaz.

Arşiv İçeriğini Görüntüleme

Arşivi açmadan önce içine bakmak iyi bir alışkanlıktır. Özellikle güvenmediğin kaynaklardan gelen dosyalarda:

# Dosya listesi
unzip -l arsiv.zip

# Ayrıntılı liste (boyut, tarih, sıkıştırma oranı)
unzip -v arsiv.zip

# Bütünlük testi
unzip -t arsiv.zip

# Sadece belirli bir dosyayı test et
unzip -t arsiv.zip "önemli_dosya.txt"

Çıkarma İşlemleri

# Mevcut dizine çıkar
unzip arsiv.zip

# Belirli bir dizine çıkar
unzip arsiv.zip -d /tmp/arsiv_icerigi/

# Sessiz modda çıkar (script'lerde kullanışlı)
unzip -q arsiv.zip -d /hedef/dizin/

# Mevcut dosyaların üzerine yaz
unzip -o arsiv.zip -d /hedef/

# Mevcut dosyaları atla, sadece yenileri çıkar
unzip -n arsiv.zip -d /hedef/

Gerçek Dünya Senaryosu 2: Toplu Zip Dosyası İşleme

Müşteri sana 50 zip dosyası gönderdi ve hepsini işlemen gerekiyor. Elle uğraşmak yerine:

#!/bin/bash
# toplu_unzip.sh - Tüm zip dosyalarını ayrı klasörlere çıkarır

KAYNAK_DIZIN="/downloads/musteriden_gelen"
HEDEF_DIZIN="/islem/acilan_dosyalar"

mkdir -p "$HEDEF_DIZIN"

for zip_dosyasi in "$KAYNAK_DIZIN"/*.zip; do
    # Dosya adından uzantıyı çıkar
    dosya_adi=$(basename "$zip_dosyasi" .zip)
    
    # Her zip için ayrı klasör oluştur
    hedef="$HEDEF_DIZIN/$dosya_adi"
    mkdir -p "$hedef"
    
    echo "İşleniyor: $zip_dosyasi"
    
    # Bütünlük testi yap, sorunluysa atla
    if unzip -t "$zip_dosyasi" > /dev/null 2>&1; then
        unzip -q "$zip_dosyasi" -d "$hedef"
        echo "Başarılı: $dosya_adi"
    else
        echo "HATA: $zip_dosyasi bozuk, atlanıyor!"
    fi
done

echo "İşlem tamamlandı."

Bu script gerçek projelerimde kullandığım bir pattern. Her zip’i ayrı klasöre açıyor, böylece dosyalar birbirine karışmıyor. Bütünlük testi yaparak bozuk arşivleri de yakalıyor.

Gerçek Dünya Senaryosu 3: Arşiv Güncelleme

Yedekleme sistemleri kuruyorsan, her seferinde sıfırdan zip oluşturmak yerine mevcut arşivi güncelleyebilirsin:

# Değişen dosyaları mevcut arşive ekle
zip -u mevcut_yedek.zip degisen_dosya.txt yeni_dosya.conf

# Bir dizindeki tüm değişiklikleri güncelle
zip -ur yedek.zip /etc/nginx/

# Arşivden dosya sil
zip -d eski_yedek.zip "silinecek_dosya.txt"

# Birden fazla dosya sil (pattern ile)
zip -d eski_yedek.zip "*.log"

Büyük Dosyaları Parçalara Bölme

E-posta ile dosya gönderirken veya boyut sınırı olan sistemlerde işe yarayan özellik:

# 100 MB'lık parçalara böl
zip -r -s 100m buyuk_proje.zip /proje/dizini/

# 50 MB parçalar halinde
zip -s 50m parcali_yedek.zip veritabani.sql

# Parçaları birleştirip çıkarma
unzip parcali_yedek.zip
# veya
cat parcali_yedek.z01 parcali_yedek.z02 parcali_yedek.zip > tam.zip && unzip tam.zip

Windows’a gönderilecek parçalı zip’lerde bu format mükemmel çalışıyor. Karşı taraf WinRAR veya 7-Zip ile rahatça açabiliyor.

Belirli Dosyaları Seçerek Arşivleme

# Sadece .conf uzantılı dosyaları arşivle
zip yapilandirmalar.zip /etc/*.conf

# Belirli bir pattern'a uyan dosyaları arşivle
zip log_arsivi.zip /var/log/nginx/access.log.*

# Dosyaları hariç tutarak arşivle
zip -r proje.zip /proje/ -x "*.git*" -x "node_modules/*" -x "*.tmp"

# Birden fazla dizinden dosya topla
zip -r karma_yedek.zip /etc/nginx/ /etc/apache2/ /var/www/html/

Git deposu yedekliyorken .git dizinini hariç tutmak güzel bir pratik. O dizin gereksiz yere arşivi şişirir.

Zipinfo Komutu

zipinfo zip arşivleri hakkında detaylı bilgi verir ve çoğunlukla unzip ile birlikte gelir:

# Genel arşiv bilgisi
zipinfo arsiv.zip

# Kısa format
zipinfo -h arsiv.zip

# Sadece dosya isimlerini listele
zipinfo -1 arsiv.zip

# Toplam istatistikler
zipinfo -htz arsiv.zip

Bu komutu özellikle bir arşiv hakkında hızlıca bilgi almak istediğimde kullanıyorum. unzip -v‘den daha okunabilir bir çıktı veriyor.

Gerçek Dünya Senaryosu 4: Otomatik Yedekleme Script’i

Günlük çalışan, eski yedekleri temizleyen tam bir yedekleme script’i:

#!/bin/bash
# gunluk_yedek.sh - Cron ile günlük çalıştır

YEDEK_DIZIN="/backup/gunluk"
WEB_DIZIN="/var/www/html"
DB_YEDEK="/tmp/veritabani_$(date +%Y%m%d).sql"
SAKLAMA_GUNU=7

# Veritabanı yedeği al
mysqldump -u root -p"şifre" tumveritabanlari > "$DB_YEDEK" 2>/dev/null

# Yedek dizini oluştur
mkdir -p "$YEDEK_DIZIN"

# Tarihli zip arşivi oluştur
ZIP_ADI="$YEDEK_DIZIN/tam_yedek_$(date +%Y%m%d_%H%M).zip"

zip -r -q "$ZIP_ADI" 
    "$WEB_DIZIN" 
    "$DB_YEDEK" 
    /etc/nginx/ 
    /etc/mysql/ 
    -x "*/cache/*" 
    -x "*.log" 
    -x "*/tmp/*"

# Geçici DB yedeğini temizle
rm -f "$DB_YEDEK"

# Arşiv bütünlüğünü doğrula
if unzip -t "$ZIP_ADI" > /dev/null 2>&1; then
    echo "$(date): Yedek başarıyla oluşturuldu: $ZIP_ADI" >> /var/log/yedekleme.log
else
    echo "$(date): HATA - Yedek arşivi bozuk!" >> /var/log/yedekleme.log
    exit 1
fi

# Eski yedekleri temizle (7 günden eski)
find "$YEDEK_DIZIN" -name "tam_yedek_*.zip" -mtime +$SAKLAMA_GUNU -delete
echo "$(date): Eski yedekler temizlendi." >> /var/log/yedekleme.log

Bunu /etc/cron.d/ altına ekleyip her sabah 03:00’te çalıştırıyorum. Eski yedekleri otomatik siliyor, log tutuyor, bütünlük testi yapıyor. Kendi sunucularımda yıllardır bu pattern’ı kullanıyorum.

Sık Karşılaşılan Sorunlar ve Çözümleri

Türkçe Karakter Sorunu

Windows’tan gelen zip dosyalarında Türkçe karakterler bozuk görünebilir:

# Encoding belirterek aç
unzip -O CP850 windows_arsivi.zip
unzip -O CP1252 diger_arsiv.zip

# Ya da convmv ile dönüştür
convmv -f cp1252 -t utf-8 --notest bozuk_dosya.txt

Zip Bomb Koruması

Güvenmediğin zip dosyalarını açmadan önce kontrol et:

# Sıkıştırma oranına bak
unzip -v şüpheli.zip | head -20

# Toplam boyutu kontrol et
unzip -l şüpheli.zip | tail -1

# Sandbox ortamında aç
mkdir /tmp/güvenli_test
unzip şüpheli.zip -d /tmp/güvenli_test/

Eğer 1 KB’lık bir zip dosyası 10 GB’a açılıyorsa, zip bomb ile karşı karşıyasındır. Bu yüzden güvenilir olmayan kaynaklardan gelen dosyaları her zaman önce -l ile kontrol et.

İzin Hataları

# Dosya sahipliğini koru
unzip -X arsiv.zip

# Root olarak aç ve izinleri koru
sudo unzip -o arsiv.zip -d /var/www/html/
sudo chown -R www-data:www-data /var/www/html/

Bozuk Arşivi Kurtarma

# Arşivi onarma denemesi
zip -F bozuk_arsiv.zip --out onarilan_arsiv.zip

# Daha agresif onarım
zip -FF bozuk_arsiv.zip --out onarilan_arsiv.zip

# Kurtarılabilenleri al
unzip -o onarilan_arsiv.zip -d /kurtarma/

Python ile zip İşlemleri

Bazen bash yetersiz kalır ve Python’dan zip arşiviyle işlem yapmak gerekir. Sunucuda Python scripti çalıştırıyorsan bu kullanışlı olabilir:

# Python ile zip içeriğini listele
python3 -c "
import zipfile
with zipfile.ZipFile('arsiv.zip', 'r') as z:
    for info in z.infolist():
        print(f'{info.filename}: {info.file_size} bytes')
"

# Belirli bir dosyayı çıkar
python3 -c "
import zipfile
with zipfile.ZipFile('arsiv.zip', 'r') as z:
    z.extract('istenen_dosya.txt', '/hedef/dizin/')
"

Performans İpuçları

  • Büyük log dosyaları için -9 kullan, çok iyi sıkıştırılır.
  • Medya dosyaları için -0 veya -1 kullan, sıkıştırma fayda sağlamaz.
  • Çok dosyalı arşivlerde -q parametresi hızı artırır, ekrana yazma işlemi zaman alır.
  • SSD’de yüksek sıkıştırma seviyesi kullanmak daha mantıklı, disk yazma hızı darboğaz değil, CPU işlemi darboğaz.
  • Paralel sıkıştırma için pigz veya pbzip2 ile tar kullanmayı düşün, zip paralel çalışma desteği sunmaz.

Sonuç

zip ve unzip komutları görünürde basit ama gerçek anlamda güçlü araçlar. Çapraz platform uyumluluğu, rastgele dosya erişimi, şifreleme ve parçalı arşiv desteğiyle sadece “Windows’tan gelen dosyaları aç” görevinin çok ötesine geçiyor.

En çok işine yarayacak komutları özetleyeyim: Dizin arşivlerken -r‘yi unutma. Script’lerde -q kullan, gereksiz çıktı seni yavaşlatır. Arşivi açmadan önce -l ile içine bak. Yedekleme script’lerinde her zaman -t ile bütünlük testi yap. Türkçe veya özel karakterli dosyalarda encoding sorunlarına dikkat et.

Tar.gz Linux’un native formatı olarak kalacak, ancak Windows ve Mac kullanıcılarıyla çalışıyorsan, müşterilere dosya gönderiyorsan veya farklı platformlar arasında geçiş yapıyorsan zip formatı seni hiç yarı yolda bırakmaz. Bir sysadmin’in araç çantasında mutlaka olması gereken iki komut bunlar.

Yorum yapın