unzip Komutu ile Zip Dosyalarini Acma ve Icerik Listeleme

unzip komutu, Linux sistemlerde zip arsivlerini acmak ve yonetmek icin kullanilan temel araclardan biridir. Tek bir dosyayi cikarma, belirli dizine acma veya sadece icerik listeleme gibi islemleri kolayca yapabilirsiniz. Bu yazida unzip komutunun en sik kullanilan seceneklerini pratik orneklerle ele aliyoruz.

unzip Komutu: Zip Dosyalarini Acma ve Icerik Listeleme

Gundelik sistem yonetimi islerinde zip dosyalari ile ugrasmaniz kacinilamaz bir gercek. Uygulama paketleri, yedek dosyalari, kullanicidan gelen arsivler… Hepsi bir sekilde masaniza geliyor. Linux uzerinde bu islemleri yapmanin en yaygın ve pratik yolu unzip komutunu kullanmak. Bu yazida unzip komutunu tum detaylariyla ele alacagiz, gercek dunya senaryolari uzerinden pratik ornekler goreceksiniz.

unzip Nedir ve Neden Kullanilir?

unzip, ZIP formatindaki arsiv dosyalarini acmak, icindeki dosyalari listelemek ve test etmek icin kullanilan bir komut satirı aracıdır. tar gibi araclarin gzip veya bzip2 ile birlikte calismasinin aksine, unzip ZIP formatini dogrudan anlayan ozel bir aractir.

ZIP formati ozellikle Windows dunyasindan gelen dosyalarda cok yaygindir. Bir web uygulamasi deploy ediyorsaniz, WordPress eklentisi kuruyorsaniz ya da bir musteriden gelen dosyalari aciyorsaniz, buyuk ihtimalle unzip ile is goreceksiniz.

Kurulum

Cogu Linux dagitiminda unzip onceden yuklu gelir. Yoksa:

# Debian/Ubuntu
sudo apt install unzip

# RHEL/CentOS/AlmaLinux
sudo dnf install unzip

# Arch Linux
sudo pacman -S unzip

Temel Kullanim

En sade haliyle kullanim suna benzer:

unzip dosya.zip

Bu komutu calistirdiginizdeki ciktiyi ilk gordugunuzde “aa, bu kadar mi basit” diye dusunebilirsiniz. Evet, bu kadar basit. Ama isin detayi bayagi derin.

Icerik Listeleme: Acmadan Once Ne Var?

Sysadmin olarak en buyuk hatalardan biri, bir zip dosyasini nerede duruyorsaniz orada acmaktir. Once icine bakin, ne var ne yok gorün. -l parametresi tam bunun icin:

unzip -l paket.zip

Tipik bir cikti soyle gorunur:

Archive:  paket.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
     1024  2024-03-15 10:23   config/app.conf
    45231  2024-03-15 10:23   bin/uygulama
     8192  2024-03-15 10:23   lib/ortak.so
---------                     -------
    54447                     3 files

Bu cikti size dosya boyutlarini, tarihleri ve icerik yapisini gosterir. Production sunucusuna bir seyler deploy etmeden once bu adimi atlamamanizi siddetle tavsiye ederim.

Daha detayli bilgi icin -v (verbose) parametresini kullanabilirsiniz. Bu, CRC degerlerini ve sikistirma oranini da gosterir:

unzip -v paket.zip

Hedef Dizine Acma

Varsayilan olarak unzip komutu calistirildiginiz dizine acar. Bu cogunlukla istemediginiz bir davranistir. -d parametresiyle hedef dizini belirtebilirsiniz:

unzip paket.zip -d /opt/uygulama/

Hedef dizin yoksa unzip onu olusturur. Ama bir not: dizin izinleriniz olmali tabii ki.

Gercek dunya senaryosu: Bir web uygulamasini deploy ederken:

# Once gecici bir yere ac
unzip uygulama_v2.1.zip -d /tmp/deploy_staging/

# Icini kontrol et
ls -la /tmp/deploy_staging/

# Her sey yolundaysa asil yerine tasima yap
rsync -av /tmp/deploy_staging/ /var/www/uygulama/

Bu sekilde production dizinini kirletmeden once kontrol etme sansiniz olur.

Belirli Dosyalari Acma

Bazen zip arsivinin tamamina ihtiyaciniz olmaz. Sadece belli bir dosyayi ya da belli dosyalari cikarmak isteyebilirsiniz:

# Sadece tek bir dosya
unzip arsiv.zip config/app.conf

# Birden fazla dosya
unzip arsiv.zip config/app.conf config/db.conf

# Wildcard ile benzer isimli dosyalar
unzip arsiv.zip "*.conf"

Wildcard kullaniminda tirnak isareti onemli. Shell’in pattern’i genisletmesini engelliyoruz, unzip kendisi hallediyor.

Gercek senaryo: Bir log arsivinden sadece bugune ait loglari cekmek istiyorsunuz:

unzip loglar_aralik.zip "2024-12-*.log" -d /tmp/bugunun_loglari/

Mevcut Dosyalarin Uzerine Yazma

Arsivi actiginizda hedef dizinde ayni isimli dosyalar varsa, unzip size her dosya icin sorar. Production ortaminda scriptler yazarken bu etkilesilim can sikici olabilir. Iki farkli yaklasim var:

Her seyi uzerine yaz (-o):

unzip -o paket.zip -d /opt/uygulama/

Hicbirini uzerine yazma (-n):

unzip -n paket.zip -d /opt/uygulama/

-n parametresi ozellikle kullanisli. Diyelim ki bir dizinde zaten bazi konfigurasyon dosyalariniz var ve bunlarin uzerine yazilmasini istemiyorsunuz, ama yeni gelen dosyalarin eklenmesini istiyorsunuz. -n tam olarak bunu yapar.

Parcali ve Karmasik Senaryolar

Sifre Korumalı Zip Dosyalari

Kullanicidan gelen veya guvenli transfer edilen zip dosyalari sifre korumalı olabilir:

unzip -P gizlisifre korumalı_dosya.zip

Tabii ki sifreyi komut satirina yazmak guvenlik acisindan iyi bir fikir degil, sifre komut gecmisinde gorunur. Interaktif olarak girilmesini tercih edin:

unzip korumalı_dosya.zip
# Sifre sorulur, tuslayip Enter'a basin

Script icinde sifre kullanmaniz sart ise, environment variable veya sifre dosyasi kullanin ve cok dikkatli olun.

Test Modu

Zip dosyasinin bozuk olup olmadigini test etmek icin -t parametresini kullanabilirsiniz. Hicbir dosya acilmaz, sadece arsiv butunlugu kontrol edilir:

unzip -t yedek.zip

Bu ozellikle yedekleme sistemlerini dogrulamak icin harika. Cron job’larınızda yedek aldiktan sonra bu testi calistirabilirsiniz:

#!/bin/bash
YEDEK_DOSYA="/yedekler/db_yedek_$(date +%Y%m%d).zip"

if unzip -t "$YEDEK_DOSYA" > /dev/null 2>&1; then
    echo "Yedek dosyasi saglikli: $YEDEK_DOSYA"
else
    echo "HATA: Yedek dosyasi bozuk! $YEDEK_DOSYA"
    # Burada alarm mekanizmanizi tetikleyin
    mail -s "Bozuk Yedek Alarmi" [email protected] <<< "Yedek dosyasi bozuk: $YEDEK_DOSYA"
fi

Cikti Kontrolu ve Sessiz Mod

Bazi durumlarda unzip’in ekrana yazdigı her seyi gormek istemezsiniz, ozellikle scriptlerde:

# Sessiz mod, hata mesajlari haric hicbir sey yazma
unzip -q paket.zip -d /hedef/

# Cok sessiz mod, hicbir sey yazma
unzip -qq paket.zip -d /hedef/

Tersine, her adimi gormek istiyorsaniz:

# Verbose, her dosyayi acerken goster
unzip -v paket.zip -d /hedef/

Gercek Dunya Senaryolari

Senaryo 1: Toplu Zip Acma

Bir dizinde yuzlerce zip dosyaniz var ve hepsini acmaniz gerekiyor. Belki kullanicilarin yukledigı dosyalar ya da bir yerden cektiginiz toplu arsivler:

#!/bin/bash
KAYNAK_DIZIN="/upload/bekleyen"
HEDEF_DIZIN="/islenmiş"

for zip_dosya in "$KAYNAK_DIZIN"/*.zip; do
    dosya_adi=$(basename "$zip_dosya" .zip)
    echo "Aciliyor: $zip_dosya"
    
    unzip -q "$zip_dosya" -d "$HEDEF_DIZIN/$dosya_adi"
    
    if [ $? -eq 0 ]; then
        echo "Basarili: $dosya_adi"
        mv "$zip_dosya" "$KAYNAK_DIZIN/tamamlanan/"
    else
        echo "HATA: $dosya_adi acilamadi"
        mv "$zip_dosya" "$KAYNAK_DIZIN/hatali/"
    fi
done

Senaryo 2: Deploy Scripti

Bir web uygulamasini zip olarak alan ve deploy eden script:

#!/bin/bash
set -e

PAKET=$1
DEPLOY_DIR="/var/www/uygulama"
YEDEK_DIR="/yedekler/deploy"
TARIH=$(date +%Y%m%d_%H%M%S)

if [ -z "$PAKET" ]; then
    echo "Kullanim: $0 paket.zip"
    exit 1
fi

# Once test et
echo "Paket kontrol ediliyor..."
unzip -t "$PAKET" || { echo "Paket bozuk!"; exit 1; }

# Mevcutu yedekle
echo "Mevcut versiyon yedekleniyor..."
zip -r "$YEDEK_DIR/yedek_$TARIH.zip" "$DEPLOY_DIR"

# Yeni surumu ac
echo "Yeni surum deploy ediliyor..."
unzip -o "$PAKET" -d "$DEPLOY_DIR"

echo "Deploy tamamlandi: $TARIH"

Senaryo 3: Zip Icindeki Belirli Dosyalari Bulmak

Buyuk bir zip arsivinin icinde belirli bir dosyanin olup olmadigini kontrol etmek:

# Arsiv icinde arama yap
unzip -l buyuk_arsiv.zip | grep "config.php"

# Sadece .conf uzantili dosyalari listele
unzip -l sistem_yedegi.zip | grep ".conf$"

# Dosya sayisini bul
unzip -l arsiv.zip | tail -1

Encoding ve Turkce Karakter Sorunu

Zip dosyalari Windows’tan geliyorsa, Turkce karakter iceren dosya isimleri bozuk gorunebilir. Bu cok klasik bir sorun:

# Encoding belirterek ac
unzip -O CP850 windows_dosyasi.zip

# Ya da
UNZIP_OPTS="-O CP850" unzip windows_dosyasi.zip

Eger bu da cozum olmuyorsa convmv aracini kullanabilirsiniz:

sudo apt install convmv
convmv -r -f cp850 -t utf-8 --notest ./acilan_dizin/

Exit Kodlari ve Hata Yonetimi

unzip belli exit kodlari dondurur, script yazarken bunlara dikkat etmelisiniz:

  • 0: Her sey yolunda
  • 1: Uyari var ama basarili
  • 2: Generic hata
  • 3: Ciddi hata, dosya acilmadi
  • 4, 5: Hafiza veya disk sorunu
  • 9: Zip dosyasi bulunamadi
  • 50-82: Arasi: Cesitli zip hatalar

Script’te kontrol:

unzip -q paket.zip -d /hedef/
EXIT_KOD=$?

case $EXIT_KOD in
    0) echo "Basarili" ;;
    1) echo "Uyarilar var ama tamam" ;;
    2) echo "Genel hata" ;;
    *) echo "Bilinmeyen hata: $EXIT_KOD" ;;
esac

unzip ile zip Farki

Ufak bir not: unzip sadece zip acar. Ama zip komutu ile unzip ayri paketlerdir, birini kurdugunuzda digeri gelmez. Zip olusturmak icin zip komutunu ayrica kurmaniz gerekir. Bazen kullanicilar bunu karistiriyor.

ZIP’e alternatif olarak python3 -m zipfile de kullanilabilir, bazi minimal sistemlerde unzip yokken ise yarar:

python3 -m zipfile -e arsiv.zip /hedef/dizin/
python3 -m zipfile -l arsiv.zip

Performans Ipucleri

Buyuk zip dosyalariyla ugrasirken:

  • -q modunu tercih edin, yazma islemi de zaman alır
  • Cok dosyali islemlerde hedef dizinin ayni disk bolumunde olmasi hızı artırır
  • Network uzerindeki bir zip’i direk acmak yerine once kopyalayip sonra acin
  • Paralel acma icin parallel komutu ile kombinleyebilirsiniz:
ls *.zip | parallel "unzip -q {} -d /hedef/{.}/"

Sonuc

unzip komutu basit gorunse de dogru kullanildiginda cok guclu bir arac. Ozellikle -l ile once iceri bakmak, -t ile butunluk kontrolu yapmak ve -d ile hedef dizin belirtmek gundelik hayatta en cok isinize yarayacak parametreler.

Scriptlerinizde exit kodlarini mutlaka kontrol edin, sessiz modu (-q) kullanin ve Windows’tan gelen dosyalar icin encoding sorununa hazırlıklı olun.

Zip dosyalariyla is yapmak bazen zahmetli gelebilir, ama bu konuya hakim olmak sizi bircok acil durumda kurtaracak. Production’da “zip acamıyorum” diye paniklemek yerine bu komutu ezberinizde bulundurmanizi tavsiye ederim.