Sistem yöneticiliğinde her gün onlarca farklı araçla çalışırsınız ama bazı komutlar o kadar temel bir yere oturur ki, onlarsız bir gün geçirmeniz neredeyse imkansız hale gelir. unzip tam olarak böyle bir araç. Basit görünür, “zip açar işte” dersiniz, ama içine girince onlarca parametre, onlarca senaryo ve ince ince detaylar çıkar karşınıza. Bu yazıda unzip komutunu her açıdan ele alacağız; temel kullanımdan başlayıp ileri düzey senaryolara kadar gideceğiz.
unzip Nedir ve Neden Hala Kullanıyoruz?
tar.gz veya tar.bz2 gibi formatlar Linux dünyasında daha yaygın olsa da, zip formatı hala her yerde karşımıza çıkıyor. Windows kullanıcılarından gelen dosyalar, web üzerinden indirilen yazılım paketleri, müşteri gönderimleri, yedek arşivler… Bunların büyük çoğunluğu hala .zip formatında geliyor. Üstelik zip formatı, hem sıkıştırma hem de paketleme işini tek başına yaptığı için cross-platform ortamlarda tercih edilen bir seçenek olmayı sürdürüyor.
unzip, bu formattaki dosyaları açmak için Linux ve diğer Unix tabanlı sistemlerde kullanılan standart araçtır. Çoğu dağıtımda varsayılan olarak gelir, gelmiyorsa da paket yöneticinizle iki dakikada kurarsınız.
Kurulum
Sisteminizde unzip yoksa kurulum oldukça basit:
# Debian/Ubuntu tabanlı sistemler
sudo apt-get install unzip
# RHEL/CentOS/Fedora tabanlı sistemler
sudo yum install unzip
# veya
sudo dnf install unzip
# Arch Linux
sudo pacman -S unzip
# macOS (Homebrew ile)
brew install unzip
Kurulum sonrası versiyon kontrolü yapın:
unzip --version
Temel Kullanım
En basit haliyle unzip, bir zip dosyasını bulunduğunuz dizine açar:
unzip dosya.zip
Bu kadar. Ama bu basit komut bile bazı durumlarda beklediğinizden farklı davranabilir. Mesela mevcut dizinde aynı isimde dosyalar varsa size sorar, çakışan her dosya için ne yapmak istediğinizi bekler. Otomasyonda bunu kullanıyorsanız bu interaktif bekleme sizi mahvedebilir, bunun üzerine birazdan geleceğiz.
İçerik Listeleme
Bir zip dosyasını açmadan önce içinde ne olduğuna bakmak çoğu zaman akıllıca bir harekettir. Özellikle güvenilmeyen kaynaklardan gelen dosyalarda, arşivi açmadan önce içeriği incelemek iyi bir alışkanlık.
unzip -l arsiv.zip
Bu komut size dosyaların listesini, boyutlarını ve değiştirilme tarihlerini gösterir. Çıktı şuna benzer bir şey olacaktır:
Archive: arsiv.zip
Length Date Time Name
--------- ---------- ----- ----
1024 2024-01-15 10:30 config/settings.json
45678 2024-01-15 10:31 data/users.csv
2048 2024-01-15 10:32 README.md
--------- -------
48750 3 files
Daha ayrıntılı bilgi için -v parametresini kullanabilirsiniz:
unzip -v arsiv.zip
Bu çıktıda sıkıştırma oranı ve kullanılan yöntem gibi ek bilgiler de görünür. Büyük arşivlerde hangi dosyaların ne kadar yer kapladığını anlamak için kullanışlı.
Temel Parametreler
unzip‘in en sık kullanılan parametrelerini bir listede toplayalım:
- -l: Arşiv içeriğini listele, açma
- -v: Ayrıntılı içerik listesi (sıkıştırma oranı dahil)
- -t: Arşivi test et, bütünlük kontrolü yap
- -d hedef_dizin: Belirtilen dizine aç
- -o: Mevcut dosyaların üzerine yaz, sormadan geç
- -n: Mevcut dosyaların üzerine yazma, atla
- -q: Sessiz mod, minimal çıktı
- -qq: Tam sessiz mod, hiç çıktı verme
- -p: Dosyaları stdout’a çıkar (pipe kullanımı için)
- -j: Dizin yapısını yok say, her şeyi düz dizine çıkar
- -x dosya: Belirtilen dosyayı açma işleminden hariç tut
- -P şifre: Şifreli arşiv için şifre belirt
Belirli Bir Dizine Açma
Arşivi bulunduğunuz dizine değil de başka bir yere açmak istiyorsanız -d parametresini kullanın:
unzip arsiv.zip -d /tmp/acma_dizini
Hedef dizin yoksa unzip otomatik olarak oluşturur. Bu davranış bir çok senaryoda hayat kurtarıcıdır.
Gerçek hayat örneği: Bir web uygulaması güncellemesi yapıyorsunuz. Arşivi direkt production dizinine açmak yerine önce geçici bir yere açın, kontrol edin, sonra taşıyın:
unzip yeni_surum_v2.3.zip -d /tmp/deploy_test
ls -la /tmp/deploy_test
# Dosyaları kontrol et, sonra taşı
cp -r /tmp/deploy_test/* /var/www/html/
Bütünlük Kontrolü
Özellikle ağ üzerinden veya güvenilmez bir ortamdan gelen zip dosyalarında, açmadan önce arşivin bozuk olup olmadığını test etmek kritik önem taşır. -t parametresi tam olarak bunu yapar:
unzip -t arsiv.zip
Eğer arşiv sağlıklıysa şuna benzer bir çıktı görürsünüz:
Archive: arsiv.zip
testing: config/settings.json OK
testing: data/users.csv OK
testing: README.md OK
No errors detected in compressed data in arsiv.zip.
Herhangi bir sorun varsa hata mesajı görürsünüz. Bu kontrolü otomasyona entegre etmek için çıkış kodunu kullanabilirsiniz:
if unzip -t arsiv.zip > /dev/null 2>&1; then
echo "Arşiv sağlıklı, açma işlemi başlıyor..."
unzip -q arsiv.zip -d /hedef/dizin
else
echo "HATA: Arşiv bozuk!"
exit 1
fi
Spesifik Dosyaları Açma
Bazen arşivin tamamını değil, sadece belirli dosyaları açmanız gerekir. Bunu dosya adını veya wildcard pattern’i belirterek yapabilirsiniz:
# Sadece tek bir dosya
unzip arsiv.zip config/settings.json
# Wildcard ile belirli uzantılı dosyalar
unzip arsiv.zip "*.csv"
# Belirli bir dizindeki tüm dosyalar
unzip arsiv.zip "data/*"
Wildcard kullandığınızda tırnakları unutmayın. Tırnak kullanmazsanız shell wildcardları kendisi genişletir ve arşiv içindeki path’lerle eşleşmez, arama başarısız olur.
Gerçek dünya senaryosu: Bir log arşivinden sadece belirli günlerin loglarını çekmek istiyorsunuz:
# Ocak ayına ait sadece error loglarını çek
unzip logs_2024.zip "logs/2024-01-*error*" -d /tmp/inceleme
Hariç Tutma Parametresi
Bazı durumlarda bir iki dosya dışında her şeyi açmak istersiniz. Bunun için -x parametresini kullanın:
# node_modules dizini hariç her şeyi aç
unzip proje.zip -x "node_modules/*" -d /opt/uygulama
# Birden fazla dosyayı hariç tut
unzip yedek.zip -x "*.log" -x "temp/*" -d /restore
Bu özellikle büyük proje arşivlerinde gereksiz dosyaları atlayarak zaman kazandırır.
Sessiz Mod ve Otomasyon
Script’lerde veya cron job’larında unzip kullanıyorsanız, gereksiz çıktıyı bastırmak için sessiz modları kullanın:
# Minimal çıktı
unzip -q arsiv.zip -d /hedef
# Hiç çıktı yok, sadece hata mesajları
unzip -qq arsiv.zip -d /hedef
# Hem sessiz hem üzerine yaz (tam otomatik mod)
unzip -q -o arsiv.zip -d /hedef
Otomasyon senaryosu: Her gece çalışan bir yedek restore scripti:
#!/bin/bash
YEDEK_DIZINI="/backup/incoming"
RESTORE_DIZINI="/data/restore"
LOG_DOSYASI="/var/log/restore.log"
for zip_dosyasi in "$YEDEK_DIZINI"/*.zip; do
dosya_adi=$(basename "$zip_dosyasi")
echo "$(date): $dosya_adi işleniyor..." >> "$LOG_DOSYASI"
# Önce bütünlük kontrolü
if ! unzip -t "$zip_dosyasi" > /dev/null 2>&1; then
echo "$(date): HATA - $dosya_adi bozuk!" >> "$LOG_DOSYASI"
continue
fi
# Açma işlemi
if unzip -qq -o "$zip_dosyasi" -d "$RESTORE_DIZINI"; then
echo "$(date): $dosya_adi başarıyla açıldı." >> "$LOG_DOSYASI"
mv "$zip_dosyasi" "$YEDEK_DIZINI/islendi/"
else
echo "$(date): HATA - $dosya_adi açılamadı!" >> "$LOG_DOSYASI"
fi
done
Şifreli Arşivler
Şifreli zip arşivleriyle de sık sık karşılaşırsınız. Şifreyi komut satırından vermek için -P parametresini kullanabilirsiniz:
unzip -P "gizli_sifre123" sifreliziparsiv.zip
Ancak bu yöntemi production ortamında kullanmaktan kaçının! Şifre, history dosyasında ve process listesinde görünür. Bunun yerine şifreyi environment variable üzerinden verin ya da interaktif girişe bırakın:
# Güvenli yol: Şifreyi env variable'dan al
unzip -P "$ZIP_SIFRE" arsiv.zip
# Ya da sadece dosya adını belirt, unzip şifre sorar
unzip sifreliziparsiv.zip
Script’lerde şifre kullanmanız gerekiyorsa ve güvenlik kritikse, şifreyi bir dosyadan okuyun ve geçici bir değişkene atayın, işlem sonrası değişkeni temizleyin.
Dizin Yapısını Yok Sayma
Bazen arşiv içindeki dizin hiyerarşisini umursamaz, tüm dosyaların tek bir dizine dökülmesini istersiniz. -j parametresi tam bu işi yapar:
unzip -j arsiv.zip -d /tek/dizin
Bu özellikle dosya adlarını toplu işleyeceğiniz durumlarda kullanışlıdır. Örneğin, derin bir dizin yapısına sahip bir arşivden sadece .jpg dosyalarını tek bir dizine çekmek istiyorsanız:
unzip -j fotograflar.zip "*.jpg" -d /tmp/fotograflar
Dikkat: Farklı dizinlerde aynı isimli dosyalar varsa -j ile bunlar birbirinin üzerine yazılır.
stdout’a Açma
-p parametresiyle arşiv içeriğini dosyaya yazmadan doğrudan stdout’a aktarabilirsiniz. Bu pipe işlemlerinde çok işe yarar:
# Arşiv içindeki bir dosyayı doğrudan görüntüle
unzip -p arsiv.zip config/database.json | python3 -m json.tool
# Arşivdeki bir SQL dump'ı direkt veritabanına yükle
unzip -p yedek.zip backup.sql | mysql -u root -p veritabani_adi
# Büyük bir CSV dosyasını açmadan analiz et
unzip -p veri.zip data/users.csv | head -20
unzip -p veri.zip data/users.csv | wc -l
Bu teknik, geçici dosya oluşturmaktan kaçınmak istediğinizde ya da tek geçişte veriyi işlemeniz gerektiğinde oldukça değerlidir.
Karakter Seti Sorunları
Türkçe ortamda çalışanlar için bu bölüm özellikle önemli. Windows ortamında oluşturulmuş zip dosyalarında dosya adları genellikle CP850 veya CP1252 encoding ile kaydedilir. Linux’ta açtığınızda Türkçe karakter içeren dosya adları bozuk görünebilir.
Modern unzip sürümlerinde -O parametresiyle encoding belirtebilirsiniz:
# Windows Türkçe encoding ile açılmış dosyalar için
unzip -O CP1252 windows_arsiv.zip
# veya
unzip -O IBM866 diger_arsiv.zip
Bu parametre tüm dağıtımlarda mevcut olmayabilir. Yoksa convmv aracıyla dosya adlarını dönüştürebilirsiniz:
unzip windows_arsiv.zip
convmv -f cp1252 -t utf-8 --notest *
Büyük Arşivlerle Çalışma
Gigabyte boyutundaki arşivlerle çalışırken bazı pratik noktalara dikkat etmek gerekir.
Önce arşiv boyutunu ve içeriğini listeleyerek ne kadar disk alanı gerektiğini hesaplayın:
# Açılmış toplam boyutu göster
unzip -l buyuk_arsiv.zip | tail -1
Çıktının en altındaki satır size toplam sıkıştırılmamış boyutu verir. Hedef diskte bu kadar boş alan olduğundan emin olun.
Büyük arşivleri açarken ilerlemeyi takip etmek için pv aracını kullanabilirsiniz, ama unzip doğrudan pipe’ı desteklemediğinden bu biraz çetrefilli. Alternatif olarak açma işlemi sırasında başka bir terminalde takip edebilirsiniz:
# Terminal 1: Açma işlemi
unzip -q buyuk_arsiv.zip -d /hedef/
# Terminal 2: İlerlemeyi takip et
watch -n 2 'du -sh /hedef/'
Hata Senaryoları ve Çözümleri
Sysadmin olarak en sık karşılaştığım hataları ve çözümleri paylaşayım:
“End-of-central-directory signature not found” hatası: Dosya ya gerçekten bir zip değil, ya da indirilirken bozulmuş. MD5/SHA checksum varsa kontrol edin, yoksa yeniden indirin.
“zipfile is empty” hatası: Zip dosyasının boyutu 0 byte veya çok küçük. ls -la dosya.zip ile kontrol edin.
“need PK compat. v4.5 (can do v2.1)” hatası: Arşiv zip64 formatında veya yeni bir özellik kullanıyor. unzip‘in güncel sürümünü deneyin ya da 7zip kullanın:
7z x arsiv.zip -o/hedef/dizin
“cannot create … Permission denied” hatası: Hedef dizinde yazma izniniz yok. sudo kullanın veya dizin izinlerini düzeltin.
Disk dolu hatası: Açma işlemi sırasında disk dolmuş olabilir. df -h ile kontrol edin, farklı bir dizine açmayı deneyin.
Toplu İşlem Senaryosu
Birden fazla zip dosyasını toplu olarak açmak sık karşılaşılan bir senaryo:
#!/bin/bash
# Belirtilen dizindeki tüm zip'leri kendi adlarıyla klasör oluşturarak aç
KAYNAK="/downloads/arsivler"
HEDEF="/data/acilmis"
mkdir -p "$HEDEF"
for zip in "$KAYNAK"/*.zip; do
# Dosya adından uzantıyı kaldır
klasor_adi=$(basename "${zip%.zip}")
echo "Açılıyor: $klasor_adi"
# Bütünlük kontrolü
if unzip -t "$zip" > /dev/null 2>&1; then
unzip -q "$zip" -d "$HEDEF/$klasor_adi"
echo "Tamam: $klasor_adi"
else
echo "Bozuk arşiv atlandı: $(basename $zip)"
fi
done
echo "Tüm işlemler tamamlandı."
unzip ile zip Karşılaştırması
unzip yalnızca açma ve listeleme için kullanılır. Arşiv oluşturmak için zip komutuna ihtiyacınız vardır. Ancak bu ikisi her zaman birlikte kurulur ve sysadmin araç setinin ayrılmaz bir parçasını oluşturur.
Alternatiflere de değinelim. 7zip (7z komutu) hem daha iyi sıkıştırma oranı sunar hem de çok daha fazla formatı destekler. bsdtar da zip dosyalarını açabilir. Ancak standart Linux ortamında unzip birinci tercih olmaya devam eder çünkü her yerde kurulu gelir ve basit kullanımı vardır.
Güvenlik Notları
“Zip slip” saldırısı adı verilen bir güvenlik açığından bahsetmek gerekiyor. Kötü niyetli olarak hazırlanmış bir zip dosyası, ../ gibi path traversal ifadeleri içeren dosya adları barındırabilir. unzip modern sürümlerde bu tür dosyaları açarken uyarı verir veya reddeder, ama güvenilmeyen kaynaklardan gelen arşivleri her zaman önce listeleyip inceleyin:
# Şüpheli path'leri kontrol et
unzip -l guvenilmez.zip | grep ".."
Bu komut çıktı veriyorsa, o arşivi açmadan önce iki kez düşünün.
Sonuç
unzip komutu, yüzeysel bakıldığında tek satırlık basit bir araç gibi görünür. Ama gerçek sysadmin senaryolarında bu komutu ne kadar iyi kullandığınız, iş akışlarınızın kalitesini doğrudan etkiler. Bütünlük kontrolünü atlamamak, otomasyon scriptlerinde doğru parametreleri kullanmak, karakter seti sorunlarının farkında olmak ve güvenlik açıklarına karşı dikkatli olmak; bunlar sıradan bir kullanıcıyı deneyimli bir sistem yöneticisinden ayıran detaylardır.
Yazı boyunca ele aldığımız -l, -t, -d, -o, -q, -j, -p, -x gibi parametreler günlük işlerinizin büyük çoğunluğunu karşılar. Bunları ezberlemek yerine ihtiyaç duydukça man unzip ile referans almanızı öneririm. Önemli olan hangi parametrenin var olduğunu bilmek; detaylar her zaman man sayfasında.
Bir sonraki adım olarak zip komutuyla arşiv oluşturmayı, ardından zipgrep ile arşiv içinde arama yapmayı incelemenizi tavsiye ederim. Bu üçlü bir arada olduğunda zip formatıyla ilgili neredeyse her işi halledebilirsiniz.