Sistem yöneticiliğinde dosya sıkıştırma günlük hayatın kaçınılmaz bir parçası. Log dosyalarını arşivlemek, yedek almak, kullanıcılara dosya paketi göndermek ya da disk alanı kazanmak için sıkıştırma araçlarına sürekli ihtiyaç duyarız. Linux dünyasında tar.gz kombinasyonu çok yaygın olsa da, özellikle Windows kullanıcılarıyla dosya paylaşımı söz konusu olduğunda zip formatı hala birinci tercih olmaya devam ediyor. Bu yazıda zip komutunu her açıdan ele alacağız.
zip Komutuna Genel Bakış
zip, ZIP formatında sıkıştırılmış arşiv dosyaları oluşturmak için kullanılan bir komut satırı aracıdır. 1990’lı yıllardan bu yana standart bir format olan ZIP, hem Linux hem Windows hem de macOS tarafından doğal olarak desteklenir. Bu çapraz platform uyumluluğu, zip’i özellikle farklı işletim sistemleri arasında dosya transferi yapılan ortamlarda vazgeçilmez kılar.
zip komutu sisteminizde kurulu değilse, dağıtımınıza göre şu şekilde yükleyebilirsiniz:
# Debian/Ubuntu tabanlı sistemler
sudo apt install zip unzip
# RHEL/CentOS/Fedora tabanlı sistemler
sudo dnf install zip unzip
# Arch Linux
sudo pacman -S zip unzip
Temel sözdizimi şu şekildedir:
zip [seçenekler] arşiv_adı.zip dosya1 dosya2 ...
Temel Kullanım: İlk Adımlar
En basit kullanım senaryosundan başlayalım. Bir veya birden fazla dosyayı tek bir zip arşivine eklemek:
# Tek dosyayı sıkıştırma
zip arsiv.zip rapor.pdf
# Birden fazla dosyayı tek arşive ekleme
zip arsiv.zip rapor.pdf sunum.pptx notlar.txt
# Mevcut arşive yeni dosya ekleme
zip arsiv.zip yeni_dosya.txt
Burada önemli bir nokta var: Eğer arsiv.zip dosyası zaten mevcutsa, zip komutu onu silip yeniden oluşturmaz. Mevcut arşive yeni dosyayı ekler. Bu davranış bazen kafa karıştırıcı olabilir ama aslında oldukça kullanışlı.
Dizinleri Sıkıştırma: -r Seçeneği
Sadece dosyalar değil, tüm dizinleri sıkıştırmak için -r (recursive) seçeneğini kullanırız. Bu, dizin yapısını ve içindeki tüm dosyaları arşive dahil eder:
# Bir dizini tüm içeriğiyle sıkıştırma
zip -r proje_yedek.zip /home/kullanici/proje/
# Birden fazla dizini tek arşive ekleme
zip -r tum_yedekler.zip /etc/nginx/ /etc/mysql/ /var/www/html/
# Mevcut dizini sıkıştırma (nokta ile)
zip -r arsiv.zip .
-r seçeneğini kullanmadan bir dizini zip’lemeye çalışırsanız, zip size uyarı verir ve dizini atlar. Bu yüzden dizin sıkıştırırken -r seçeneğini asla unutmayın.
Sık Kullanılan Seçenekler
zip komutunun en çok ihtiyaç duyulan parametrelerini şöyle sıralayabiliriz:
- -r: Alt dizinleri de dahil ederek yinelemeli sıkıştırma yapar
- -9: Maksimum sıkıştırma oranı uygular (yavaş ama küçük dosya)
- -1: Minimum sıkıştırma, maksimum hız (dosya boyutu büyük olur)
- -e: Arşivi şifre ile korur (interaktif şifre girişi)
- -P: Şifreyi komut satırında belirtmenizi sağlar (güvenlik riski var)
- -v: Ayrıntılı çıktı gösterir (verbose mod)
- -q: Sessiz mod, hiçbir çıktı vermez (script’lerde kullanışlı)
- -u: Arşivdeki dosyaları günceller, sadece değişen dosyaları ekler
- -d: Arşivden belirli dosyaları siler
- -x: Belirtilen dosyaları veya desenleri arşivden dışlar
- -j: Dizin yapısını korumaz, sadece dosyaları düz olarak ekler
- -m: Dosyaları arşive ekledikten sonra orijinallerini siler
- -T: Arşivin bütünlüğünü test eder
- -sf: Arşiv içindeki dosyaları listeler (show files)
Sıkıştırma Seviyesini Ayarlama
zip, 0’dan 9’a kadar sıkıştırma seviyeleri sunar. Varsayılan değer 6’dır ve çoğu durumda makul bir denge sağlar:
# Sıkıştırma yok, sadece arşivleme (en hızlı)
zip -0 hizli_arsiv.zip buyuk_dosya.iso
# Varsayılan sıkıştırma (seviye 6)
zip arsiv.zip dosyalar/
# Maksimum sıkıştırma (en yavaş, en küçük dosya)
zip -9 maksimum_sikistirma.zip buyuk_metin_dosyalari/
# Hızlı sıkıştırma (seviye 1)
zip -1 hizli.zip log_dosyalari/
Pratik bir not: Zaten sıkıştırılmış dosyalar (JPEG, MP4, PDF, ZIP) üzerinde yüksek sıkıştırma seviyesi kullanmak pek fayda sağlamaz. Sadece işlem süresini uzatır. Metin dosyaları, log dosyaları ve kaynak kodlar için yüksek sıkıştırma seviyeleri anlamlı boyut küçülmesi sağlar.
Şifreli ZIP Arşivi Oluşturma
Hassas verileri paylaşmak zorunda kaldığınızda arşivi şifre ile korumak isteyebilirsiniz:
# İnteraktif şifre girişi (-e seçeneği)
zip -e gizli_belgeler.zip onemli_dosyalar/
# Sistem sizden şifre ve tekrar girişi isteyecektir
# Şifreyi komut satırında belirtme (log'larda görünür, dikkatli kullanın)
zip -P "sifrem123" gizli.zip dosya.txt
Önemli bir uyarı: -P seçeneği ile komut satırına yazdığınız şifre, sistem log’larında ve bash geçmişinde görünebilir. Script’lerde mutlaka alternatif yöntemler kullanın veya şifreyi bir değişkenden okuyun.
Ayrıca zip’in kullandığı şifreleme (ZipCrypto), modern standartlara göre zayıf kabul edilir. Gerçekten hassas veriler için gpg veya AES-256 destekli 7zip gibi araçları tercih etmelisiniz.
Belirli Dosyaları Dışlama: -x Seçeneği
Bir dizini toplu sıkıştırırken bazı dosyaları veya dizinleri arşive dahil etmek istemeyebilirsiniz:
# .log uzantılı dosyaları dışarıda bırak
zip -r proje.zip /var/www/html/ -x "*.log"
# Birden fazla deseni dışla
zip -r proje.zip /home/kullanici/proje/ -x "*.git*" -x "node_modules/*" -x "*.tmp"
# Belirli bir dizini tamamen dışla
zip -r yedek.zip /etc/ -x "/etc/ssl/private/*"
Web projesi yedekleri alırken node_modules veya .git dizinlerini dışlamak çok yaygın bir ihtiyaçtır. Bu dizinler çoğunlukla yüzlerce megabayt yer kaplar ve yedekte bulunmaları gerekmez.
Arşivi Test Etme ve İçeriğini Listeleme
Oluşturduğunuz arşivin sağlıklı olup olmadığını test etmek ve içeriğini görmek için:
# Arşiv içeriğini listele
zip -sf arsiv.zip
# unzip ile daha detaylı listeleme
unzip -l arsiv.zip
# Arşivi test et (açmadan bütünlük kontrolü)
zip -T arsiv.zip
# unzip ile test
unzip -t arsiv.zip
# Arşiv hakkında detaylı bilgi
unzip -v arsiv.zip
Bu komutlar özellikle büyük yedek dosyalarını doğrulamak için kritik önem taşır. Yedeği almak yetmez, aldığınız yedeğin açılabilir olduğundan da emin olmanız gerekir.
Gerçek Dünya Senaryoları
Senaryo 1: Web Sunucusu Günlük Yedekleme Script’i
Bir web sunucusunu yönettiğinizi düşünelim. Her gece site dosyalarının ve yapılandırma dosyalarının yedeğini almak istiyorsunuz:
#!/bin/bash
# /usr/local/bin/gunluk_yedek.sh
TARIH=$(date +%Y%m%d)
YEDEK_DIZIN="/backup/web"
LOG_DIZIN="/var/log/yedekleme"
# Yedek dizini oluştur
mkdir -p "$YEDEK_DIZIN"
mkdir -p "$LOG_DIZIN"
echo "[$TARIH] Yedekleme basliyor..." >> "$LOG_DIZIN/yedek.log"
# Web dosyalarını sıkıştır (git ve cache dizinlerini dışla)
zip -9 -r -q "$YEDEK_DIZIN/web_$TARIH.zip" /var/www/html/
-x "*/.git/*"
-x "*/cache/*"
-x "*/tmp/*"
-x "*.log"
# Arşivi doğrula
if zip -T "$YEDEK_DIZIN/web_$TARIH.zip" > /dev/null 2>&1; then
echo "[$TARIH] Yedekleme basarili: web_$TARIH.zip" >> "$LOG_DIZIN/yedek.log"
else
echo "[$TARIH] HATA: Yedek dosyasi bozuk!" >> "$LOG_DIZIN/yedek.log"
exit 1
fi
# Nginx ve PHP yapılandırmalarını ayrı arşivle
zip -9 -r -q "$YEDEK_DIZIN/konfig_$TARIH.zip"
/etc/nginx/
/etc/php/
/etc/mysql/
# 30 günden eski yedekleri temizle
find "$YEDEK_DIZIN" -name "*.zip" -mtime +30 -delete
echo "[$TARIH] Eski yedekler temizlendi." >> "$LOG_DIZIN/yedek.log"
Bu script’i crontab’a ekleyerek her gece otomatik çalıştırabilirsiniz:
# Crontab'a eklemek için: crontab -e
0 2 * * * /usr/local/bin/gunluk_yedek.sh
Senaryo 2: Log Dosyalarını Arşivleme
Disk dolmaya başladığında log dosyalarını sıkıştırıp eski olanları temizlemek sık karşılaşılan bir durumdur:
#!/bin/bash
# Belirli yaştaki log dosyalarını zip'le ve orijinali sil
LOG_YOLU="/var/log/uygulama"
ARSIV_YOLU="/archive/logs"
mkdir -p "$ARSIV_YOLU"
# 7 günden eski log dosyalarını bul ve zip'le
find "$LOG_YOLU" -name "*.log" -mtime +7 | while read log_dosyasi; do
dosya_adi=$(basename "$log_dosyasi")
tarih=$(date +%Y%m%d_%H%M%S)
# Sıkıştır (-m ile orijinali sil)
zip -9 -q -m "$ARSIV_YOLU/${dosya_adi}_${tarih}.zip" "$log_dosyasi"
echo "Arsivlendi: $dosya_adi"
done
echo "Log arsivleme tamamlandi."
Senaryo 3: Proje Dağıtımı İçin Zip Paketi Hazırlama
Bir yazılım projesinin dağıtım paketini hazırlarken gereksiz dosyaları dışlamak önemlidir:
#!/bin/bash
# Proje dağıtım paketi oluşturma
PROJE_ADI="uygulama"
VERSIYON=$(cat version.txt)
PAKET_ADI="${PROJE_ADI}_v${VERSIYON}.zip"
echo "Dagitim paketi olusturuluyor: $PAKET_ADI"
zip -9 -r "$PAKET_ADI" .
-x "*.git*"
-x "*.gitignore"
-x "node_modules/*"
-x "__pycache__/*"
-x "*.pyc"
-x ".env"
-x ".env.local"
-x "tests/*"
-x "*.log"
-x "*.tmp"
-x "Makefile"
-x "README_DEV.md"
# Paketin boyutunu göster
BOYUT=$(du -sh "$PAKET_ADI" | cut -f1)
echo "Paket olusturuldu: $PAKET_ADI ($BOYUT)"
# MD5 checksum oluştur
md5sum "$PAKET_ADI" > "${PAKET_ADI}.md5"
echo "Checksum dosyasi olusturuldu: ${PAKET_ADI}.md5"
Arşiv İçeriğini Güncelleme ve Yönetme
Mevcut bir zip arşivini farklı şekillerde düzenleyebilirsiniz:
# Arşivdeki değişmiş dosyaları güncelle
zip -u arsiv.zip guncellenecek_dosya.txt
# Arşivden belirli bir dosyayı sil
zip -d arsiv.zip silinecek_dosya.txt
# Arşivden birden fazla dosya sil (desen ile)
zip -d arsiv.zip "*.tmp" "*.bak"
# Dizin yapısı olmadan dosyaları düz ekle (-j)
zip -j duz_arsiv.zip /derin/bir/dizin/icindeki/dosya.txt
# Sonuçta arşivde sadece "dosya.txt" olur, dizin yapısı kaybolur
Split (Bölünmüş) ZIP Arşivi Oluşturma
Büyük dosyaları email eki olarak göndermek veya belirli boyut kısıtlamaları olan medyalara aktarmak için arşivi parçalara bölmek gerekebilir:
# 100 MB'lık parçalara böl
zip -r -s 100m buyuk_arsiv.zip /buyuk/dizin/
# 50 MB'lık parçalara böl
zip -r -s 50m parcali_arsiv.zip /video/dosyalari/
# Oluşturulan dosyalar:
# parcali_arsiv.z01
# parcali_arsiv.z02
# parcali_arsiv.zip (son parça)
Bölünmüş arşivi açmak için:
# Tüm parçalar aynı dizinde olmalı
unzip parcali_arsiv.zip
zip ve unzip Arasındaki İlişki
zip’i anlatırken unzip’ten bahsetmeden geçmek olmaz. En sık kullanılan unzip komutları:
# Mevcut dizine çıkart
unzip arsiv.zip
# Belirli bir dizine çıkart
unzip arsiv.zip -d /hedef/dizin/
# Sadece belirli dosyaları çıkart
unzip arsiv.zip "*.txt" -d /cikartilacak/yer/
# Üzerine yazmadan çıkart (mevcut dosyaları korur)
unzip -n arsiv.zip
# Her şeyin üzerine yaz (soru sormadan)
unzip -o arsiv.zip
# İçeriği listele (açmadan)
unzip -l arsiv.zip
# Şifreli arşivi aç
unzip -P "sifre" gizli.zip
Performans ve En İyi Uygulamalar
Gerçek üretim ortamlarında zip kullanırken dikkat etmeniz gereken bazı önemli noktalar var:
Sıkıştırma seviyesi seçimi: Zaten sıkıştırılmış dosyalar (JPG, MP4, PDF, ZIP, GZ) için -0 veya -1 kullanın. Metin bazlı dosyalar için -6 (varsayılan) veya -9 uygundur. Script’lerde hız önemliyse -1 ile başlayıp gerektiğinde artırın.
Büyük dosyalarda progress takibi: -v seçeneği verbose çıktı verir ama çok ayrıntılıdır. Büyük arşivler için aşağıdaki yöntemi kullanabilirsiniz:
# İşlem süresini ölçerek yedek alma
time zip -9 -r -q yedek.zip /buyuk/dizin/
echo "Yedek tamamlandi."
# pv ile ilerlemeyi takip etme (pv kurulu olmalı)
zip -r - /kaynak/dizin/ | pv > arsiv.zip
Script’lerde hata yönetimi:
#!/bin/bash
set -e # Hata durumunda script'i durdur
zip -r -q yedek.zip /onemli/dizin/
if [ $? -eq 0 ]; then
echo "Basarili"
else
echo "Hata olustu!" >&2
exit 1
fi
Sembolik linkleri yönetme:
# Sembolik linkleri takip et, gerçek dosyaları arşivle
zip -r -y arsiv.zip /dizin/ # -y: symlink'leri olduğu gibi sakla
zip -r --symlinks arsiv.zip /dizin/
tar.gz ile Karşılaştırma
Sık sorulan bir soru: “Ne zaman zip, ne zaman tar.gz kullanmalıyım?”
- zip kullanın: Windows kullanıcılarıyla paylaşım yapıyorsanız, web üzerinden indirme linkleri sunuyorsanız, arşiv içindeki bireysel dosyalara hızlı erişim gerekiyorsa (zip dosya bazında indeks tutar)
- tar.gz kullanın: Tamamen Linux/Unix ortamında çalışıyorsanız, sembolik linkler ve Unix izinleri (permissions) korunması kritikse, daha iyi sıkıştırma oranı istiyorsanız, pipeline içinde kullanıyorsanız
zip, dosya izinlerini kısmen saklar ama Unix’e özgü bazı metadata’yı (hard link, özel izinler, vb.) tam olarak koruyamaz. Sunucu yapılandırmalarını yedeklerken bu farka dikkat edin.
Sonuç
zip komutu, sadeliği ve platformlar arası uyumluluğuyla sistem yöneticisinin araç kutusunda mutlaka bulunması gereken bir araçtır. Temel sıkıştırma işlemlerinden otomatik yedekleme script’lerine, log arşivlemeden proje paketleme süreçlerine kadar geniş bir kullanım yelpazesi sunar.
En çok işinize yarayacak alışkanlıkları edinmek için şunları öneririm: Her zaman zip -T ile arşiv bütünlüğünü doğrulayın, yedekleme script’lerinde -q kullanarak gereksiz çıktıyı azaltın, dışlama desenleriyle (-x) arşiv boyutlarını kontrol altında tutun. Şifreli arşivler için zip’in güvenlik sınırlamalarını göz önünde bulundurun ve gerektiğinde daha güçlü araçlara yönelin.
Günlük sistem yönetimi rutinlerinizde zip komutuna yer verdikçe, hangi seçeneklerin hangi senaryolarda işe yaradığını pratik olarak öğreneceksiniz. Komut satırının güzelliği de zaten bu: Her kullandığınızda biraz daha verimli hale geliyorsunuz.