Arşiv İçeriğini Açmadan İnceleme ve Listeleme

Bir üretim sunucusuna bağlandınız, önünüzde gigabaytlarca arşiv dosyası var ve hangisinde ne olduğunu bilmiyorsunuz. Her birini açıp içeriğe bakmak hem zaman kaybı hem de disk alanı israfı olur. İşte tam bu noktada arşiv içeriğini açmadan inceleme sanatı devreye giriyor. Linux’ta bu işi yapan araçlar hem güçlü hem de son derece pratik. Bu yazıda gerçek dünya senaryolarıyla bu araçları tek tek ele alacağız.

Neden Açmadan İncelemek Önemli?

Sistem yöneticisi olarak günde onlarca kez arşiv dosyalarıyla karşılaşıyorsunuz. Backup scriptlerinizin doğru çalışıp çalışmadığını kontrol etmek, bir deployment paketinin içinde hangi config dosyalarının olduğunu görmek ya da birileri tarafından sunucuya yüklenen bir tar.gz’nin güvenli olup olmadığını anlamak için arşivi açmaya gerek yok.

Açmadan incelemenin faydaları şunlar:

  • Disk alanı tasarrufu: 10 GB’lık bir arşivi sadece listesine bakmak için açmak saçmalık olur
  • Zaman kazancı: Listeleme işlemi saniyeler içinde biter, açma işlemi dakikalar alabilir
  • Güvenlik: Bilinmeyen bir arşivi açmadan önce içeriğini görmek, path traversal saldırılarına karşı koruma sağlar
  • Otomasyon: Script içinde belirli bir dosyanın arşivde olup olmadığını kontrol edebilirsiniz

tar Arşivlerini İnceleme

tar komutu, Linux dünyasının en temel arşiv aracıdır ve içerik listeleme konusunda oldukça yeteneklidir.

Temel Listeleme

tar -tf /backup/sunucu_backup_20241215.tar.gz

Bu komut arşivdeki tüm dosya ve dizin listesini ekrana basar. Buradaki parametreler:

-t: Arşiv içeriğini listele (list) -f: Dosya adını belirt

Gzip sıkıştırmalı tar dosyaları için -z parametresine gerek yoktur; modern tar versiyonları sıkıştırma tipini otomatik algılar. Ama alışkanlıkla yazabilirsiniz, zararı yok.

Detaylı Listeleme

tar -tvf /backup/sunucu_backup_20241215.tar.gz

-v: Verbose mod, dosya izinleri, sahiplik, boyut ve tarih bilgilerini de gösterir

Bu komutun çıktısı şöyle görünür:

-rw-r--r-- root/root      2048 2024-12-15 14:23 etc/nginx/nginx.conf
-rw-r--r-- root/root      512  2024-12-15 14:23 etc/nginx/conf.d/default.conf
drwxr-xr-x root/root      0    2024-12-15 14:20 var/www/html/
-rw-r--r-- www-data/www-data 45231 2024-12-15 14:22 var/www/html/index.php

Bu format ls -la çıktısına benziyor, dolayısıyla zaten aşinasınız.

Belirli Bir Dosyanın Arşivde Olup Olmadığını Kontrol Etme

Gerçek hayatta çok kullandığım bir senaryo: Backup scriptinin belirli bir config dosyasını arşive dahil edip etmediğini kontrol etmek.

tar -tf /backup/gunluk_backup.tar.gz | grep "nginx.conf"

Script içinde kullanmak için:

#!/bin/bash
ARSIV="/backup/gunluk_backup.tar.gz"
HEDEF_DOSYA="etc/nginx/nginx.conf"

if tar -tf "$ARSIV" | grep -q "$HEDEF_DOSYA"; then
    echo "OK: nginx.conf arşivde mevcut"
else
    echo "HATA: nginx.conf arşivde bulunamadi!"
    exit 1
fi

Arşiv İstatistiklerini Görme

tar -tvf /backup/buyuk_backup.tar.gz | wc -l

Bu komut arşivdeki toplam dosya ve dizin sayısını verir. Binlerce satır çıktıyı okumak yerine sadece sayıyı görmek istiyorsanız işe yarar.

zip Dosyalarını İnceleme

zip formatı özellikle Windows ile veri alışverişinde veya Java uygulamalarında (JAR dosyaları da birer zip) çok yaygın.

zipinfo Komutu

zipinfo, zip arşivleri için özel tasarlanmış bir araçtır ve çok ayrıntılı bilgi sunar:

zipinfo uygulama_paketi.zip

Çıktıda şunları görürsünüz: dosya sayısı, toplam sıkıştırılmamış boyut, sıkıştırılmış boyut, sıkıştırma oranı ve her dosyanın izin bilgileri.

zipinfo -1 uygulama_paketi.zip

-1: Sadece dosya adlarını listeler, başka hiçbir şey eklemez. Boru hattında kullanmak için ideal.

zipinfo -v uygulama_paketi.zip

-v: Her dosya için detaylı bilgi verir, CRC32 checksum dahil.

unzip ile Listeleme

unzip komutu da -l parametresiyle içerik listeleyebilir:

unzip -l uygulama_paketi.zip
unzip -l uygulama_paketi.zip | grep ".properties$"

Bu komut zip içindeki tüm .properties uzantılı dosyaları bulur. Java uygulama paketlerinde config dosyalarını ararken çok işe yarıyor.

JAR Dosyalarını İnceleme

Java geliştirici veya DevOps ekibiyle çalışıyorsanız JAR dosyalarıyla sık karşılaşırsınız. JAR, aslında zip formatıdır:

unzip -l uygulama.jar | grep "application.properties"

Ya da jar komutunu kullanabilirsiniz:

jar tf uygulama.jar | head -50

7z Arşivlerini İnceleme

7-Zip formatı yüksek sıkıştırma oranıyla bilinir ve p7zip paketiyle Linux’ta kullanılabilir.

7z l arsiv.7z

l: List anlamına gelir

7z l -slt arsiv.7z

-slt: Technical listing format, her dosya için ayrıntılı teknik bilgi verir. CRC, şifreleme durumu, method gibi bilgiler görünür. Özellikle şifreli arşivlerde hangi dosyaların şifreli olduğunu anlamak için kullanışlıdır.

Gerçek dünya senaryosu: Müşteriden gelen bir 7z arşivinin şifreli olup olmadığını kontrol etmek:

7z l -slt musteri_verisi.7z | grep "Encrypted"

Çıktıda Encrypted = + görürseniz dosya şifreli demektir.

rar Dosyalarını İnceleme

RAR formatı özellikle eski yedekleme sistemlerinde ve bazı yazılım dağıtımlarında karşımıza çıkıyor.

rar l arsiv.rar
unrar l arsiv.rar

Her iki komut da benzer çıktı verir. unrar daha yaygın bulunur:

l: Normal listeleme lb: Sadece dosya yollarını listeler, script dostu

unrar lb arsiv.rar | grep ".conf$"

Sıkıştırılmış Tek Dosyaları İnceleme

Bazen karşımıza tek bir dosyanın sıkıştırılmış hali çıkar, arşiv değil. Bunlar için farklı araçlar kullanıyoruz.

gzip

gzip -l /var/log/syslog.gz

Bu komut sıkıştırılmış boyut, orijinal boyut, sıkıştırma oranı ve dosya adını gösterir. Açmadan ne kadar yer kaplardı diye merak ediyorsanız bu komut cevaplar.

bzip2

bzip2 için doğrudan içerik listeleme komutu yoktur çünkü bzip2 tek dosya sıkıştırır, arşiv oluşturmaz. Ama şöyle bir trick kullanabilirsiniz:

bzcat dosya.bz2 | head -20

Bu komut dosyayı diske yazmadan sadece ilk 20 satırını gösterir. Log dosyaları için harika.

xz

xz -l dosya.xz

xz formatı, sıkıştırılmış boyut ve orijinal boyut bilgisini verir. Birden fazla xz dosyasını karşılaştırmak için de kullanabilirsiniz:

xz -l /var/log/archived/*.xz

Pratik Senaryolar ve İleri Seviye Kullanım

Senaryo 1: Backup Doğrulama Script’i

Üretim ortamında her gece çalışan bir backup script’iniz var ve sabah işe geldiğinizde backup’ların düzgün oluşup oluşmadığını kontrol etmek istiyorsunuz:

#!/bin/bash
# backup_kontrol.sh

BACKUP_DIR="/backup/daily"
TARIH=$(date +%Y%m%d)
BACKUP_DOSYASI="$BACKUP_DIR/backup_$TARIH.tar.gz"
KRITIK_DOSYALAR=("etc/nginx/nginx.conf" "etc/mysql/my.cnf" "var/www/html/wp-config.php")

echo "=== Backup Kontrol Raporu - $TARIH ==="

# Dosya var mi?
if [ ! -f "$BACKUP_DOSYASI" ]; then
    echo "KRITIK HATA: Backup dosyasi bulunamadi: $BACKUP_DOSYASI"
    exit 1
fi

# Dosya boyutu
BOYUT=$(du -sh "$BACKUP_DOSYASI" | cut -f1)
echo "Backup boyutu: $BOYUT"

# Toplam dosya sayisi
DOSYA_SAYISI=$(tar -tf "$BACKUP_DOSYASI" | wc -l)
echo "Toplam dosya/dizin sayisi: $DOSYA_SAYISI"

# Kritik dosyalari kontrol et
echo ""
echo "Kritik dosya kontrolleri:"
for DOSYA in "${KRITIK_DOSYALAR[@]}"; do
    if tar -tf "$BACKUP_DOSYASI" | grep -q "^$DOSYA$"; then
        echo "  [OK] $DOSYA"
    else
        echo "  [EKSIK] $DOSYA"
    fi
done

Senaryo 2: Arşiv İçinde Belirli Uzantıları Sayma

Bir deployment paketinin ne kadar PHP dosyası, ne kadar config dosyası içerdiğini anlamak için:

echo "PHP dosyalari: $(tar -tf deployment_v2.1.tar.gz | grep '.php$' | wc -l)"
echo "Config dosyalari: $(tar -tf deployment_v2.1.tar.gz | grep '.conf$' | wc -l)"
echo "SQL dosyalari: $(tar -tf deployment_v2.1.tar.gz | grep '.sql$' | wc -l)"

Senaryo 3: Güvenlik Kontrolü – Path Traversal Tespiti

Bilinmeyen bir kaynaktan gelen tar arşivini açmadan önce mutlaka şunu kontrol edin:

tar -tf musteri_arsivi.tar.gz | grep ".."

Eğer bu komut herhangi bir çıktı verirse, arşivde ../ gibi üst dizine çıkma girişimleri var demektir. Bu arşivi kesinlikle açmayın. Path traversal saldırısı olabilir; arşivi açtığınızda istemediğiniz dizinlere dosya yazılabilir.

Daha kapsamlı kontrol için:

tar -tf musteri_arsivi.tar.gz | grep -E "^/|^.."

Bu komut hem mutlak yol ile başlayan hem de .. içeren dosyaları tespit eder.

Senaryo 4: En Büyük Dosyaları Bulmak

Büyük bir arşivin içinde hangi dosyaların en fazla yer kapladığını bulmak için:

tar -tvf buyuk_arsiv.tar.gz | sort -k5 -rn | head -20

Bu komut dosyaları boyutlarına göre büyükten küçüğe sıralar ve ilk 20’sini gösterir. Gereksiz büyük dosyalar backup’a dahil edilmiş mi diye kontrol ederken çok kullanışlı.

Çıktıyı Biçimlendirme ve Filtreleme

Arşiv içerik listeleri genellikle çok uzun olabilir. Bunları daha okunaklı hale getirmek için birkaç teknik:

# Sadece dizinleri listele
tar -tf arsiv.tar.gz | grep "/$"

# Belirli bir dizinin altındakileri listele
tar -tf arsiv.tar.gz | grep "^var/www/"

# Dosya sayisi ozeti
tar -tf arsiv.tar.gz | awk -F/ '{print $1}' | sort -u

zip dosyaları için:

# Dosya uzantilarini say ve sirala
unzip -l arsiv.zip | awk '{print $NF}' | grep -v "/$" | sed 's/.*.//' | sort | uniq -c | sort -rn

Bu son komut arşivde kaç tane hangi uzantıdan dosya olduğunu güzel bir şekilde raporlar.

Arşiv Bütünlülük Kontrolü

İçerik listelemek aynı zamanda arşivin bozuk olup olmadığını da test etmenin bir yoludur:

# tar icin butunluk testi
tar -tzf arsiv.tar.gz > /dev/null && echo "Arsiv saglikli" || echo "Arsiv bozuk!"

# zip icin test
unzip -t arsiv.zip > /dev/null && echo "Arsiv saglikli" || echo "Arsiv bozuk!"

# 7z icin test
7z t arsiv.7z > /dev/null && echo "Arsiv saglikli" || echo "Arsiv bozuk!"

Bu kontrolleri backup scriptlerinizin sonuna eklerseniz backup’larınızın açılabilir durumda olduğunu garantilemiş olursunuz. Backup aldım ama açamıyorum durumu, sysadmin’in en kötü kabusu olduğu için bu adımı atlamamanızı tavsiye ederim.

less ile Arşiv İçeriğine Bakma

Bir küçük ama güzel özellik: Modern Linux sistemlerinde less komutu, çeşitli arşiv formatlarını doğrudan okuyabilir. lesspipe yüklüyse:

less arsiv.tar.gz

Bu komut tar.gz’nin içeriğini sayfalayarak gösterir. Gezinme için bildiğiniz tüm less kısayolları çalışır. Büyük arşivlerde içerikte /aradığınız_kelime ile arama yapabilirsiniz. Çok pratik bir özellik.

Performans Notu

Çok büyük arşivlerde (50 GB üzeri) içerik listeleme işlemi bile birkaç dakika sürebilir. Bu durumda şöyle bir trick:

# Sadece ilk 100 girdiyi goster
tar -tf cok_buyuk_arsiv.tar.gz | head -100

# Arka planda calistir ve dosyaya yaz
tar -tf cok_buyuk_arsiv.tar.gz > /tmp/arsiv_listesi.txt &
echo "PID: $! - Liste /tmp/arsiv_listesi.txt dosyasina yaziliyor"

Liste dosyasına yazdıktan sonra grep, awk, sort gibi araçlarla istediğiniz kadar analiz yapabilirsiniz ve her seferinde arşivi tekrar taramak zorunda kalmazsınız.

Sonuç

Arşiv içeriğini açmadan incelemek, sysadmin araç kutusunun vazgeçilmez bir parçası. tar -tvf ile başlayıp zipinfo, 7z l, unrar lb ile devam eden bu komutlar günlük işlerinizi ciddi oranda hızlandırır.

Özellikle şu üç alışkanlığı edinmenizi öneririm: Backup kontrollerini her zaman arşivi açmadan yapın, bilinmeyen kaynaklardan gelen arşivleri path traversal açısından kontrol edin ve büyük arşivlerde içerik listesini bir dosyaya alıp üzerinde çalışın.

Bu teknikleri script’lerinize entegre ettiğinizde, backup doğrulama, deployment kontrolü ve güvenlik taraması gibi rutin görevleriniz hem daha hızlı hem de çok daha güvenilir hale gelecek. Terminal’de geçirilen birkaç dakikalık pratik, uzun vadede saatler kazandırır.

Yorum yapın