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
-vparametresiyle ilerlemeyi takip edebilirsin -jparametresi 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:
-runutmak ve klasör içeriğinin arşivlenmediğini anlamamak--excludepattern’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.
