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:
-qmodunu 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
parallelkomutu 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.
