Açık Kaynak İşletim Sistemleri

9 - Dosya Arşivleme ve Sıkıştırma

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2025

Giriş: Neden Arşivleme ve Sıkıştırma?

  • Arşivleme: Birden fazla dosyayı ve dizini tek bir dosyada birleştirmek (tar).
    • Yönetim/Transfer kolaylığı, Yedekleme.
  • Sıkıştırma: Dosyaların veya arşivlerin boyutunu küçültmek (gzip, bzip2, xz).
    • Disk alanı/Transfer süresi tasarrufu.

Tip

Genellikle bu iki işlem birlikte yapılır: Önce tar ile arşivlenir, sonra sıkıştırılır.

tar (Tape ARchive) - Temel Kavram

  • tar komutu, dosyaları ve dizinleri tek bir arşiv dosyası (.tar) içinde toplar.
  • Tek başına tar sıkıştırma yapmaz! Sadece dosyaları bir araya getirir.

Örnek Dizin Yapısı:

cezmi@ubuntu:~$ tree Belgeler/ProjeA
Belgeler/ProjeA
├── ana_kod.py
├── belgeler
   └── README.md
└── testler -> ../../test_betikleri # Sembolik bağlantı örneği
    └── test1.py

2 directories, 3 files

tar - Arşiv Oluşturma (-c)

  • -c: create - Yeni bir arşiv oluştur.

  • -v: verbose - İşlem yapılan dosyaları listele (ÖNEMLİ!).

  • -f: file - Arşiv dosyasının adı (genellikle sonda, hemen ardından dosya adı gelir).

  • Örnek:

    # ProjeA dizinini projeA.tar olarak arşivle
    cezmi@ubuntu:~/Belgeler$ tar -cvf projeA.tar ProjeA/
    ProjeA/
    ProjeA/belgeler/
    ProjeA/belgeler/README.md
    ProjeA/testler -> ../../test_betikleri # Bağlantının korunduğuna dikkat edin
    ProjeA/testler/test1.py
    ProjeA/ana_kod.py
    
    cezmi@ubuntu:~/Belgeler$ ls
    ProjeA  projeA.tar

tar ve Dosya İzinleri/Sahiplik

  • tar arşivleri, varsayılan olarak dosyaların izinlerini (rwx), sahiplik bilgilerini (kullanıcı/grup) ve zaman damgalarını korur.
  • Bu, özellikle yedekleme ve Linux/Unix sistemleri arasında dosya taşırken çok önemlidir.
  • Arşivi açarken (özellikle root olarak), bu bilgiler geri yüklenir.
  • -p seçeneği (genellikle varsayılan olarak aktiftir) bu davranıştan sorumludur.

Tip

zip formatı genellikle bu Unix/Linux’a özgü bilgileri tam olarak korumaz.

tar ve Sembolik/Sabit Bağlantılar

  • Sembolik Bağlantılar (Symlinks): tar varsayılan olarak sembolik bağlantıları bağlantı olarak arşivler (yani hedefini değil, bağlantının kendisini). Arşiv açıldığında bağlantı yeniden oluşturulur (hedef varsa çalışır).
    • -h (veya --dereference) seçeneği ile tar’ın bağlantıları takip edip hedef dosyayı arşivlemesi sağlanabilir.
  • Sabit Bağlantılar (Hardlinks): tar sabit bağlantıları da tanır ve arşivlerken optimize edebilir (dosyanın sadece bir kopyasını saklayarak).

Tip

Yazılım projeleri veya sistem dosyaları arşivlenirken bağlantıların korunması genellikle istenir. zip genellikle bağlantıları takip eder.

tar - Arşiv İçeriğini Listeleme (-t)

  • -t: table of contents - Arşivin içeriğini açmadan listeler.

  • -v: verbose - Detaylı bilgi (izinler, sahip, boyut, tarih, bağlantı hedefi).

  • Örnek:

    cezmi@ubuntu:~/Belgeler$ tar -tvf projeA.tar
    drwxr-xr-x cezmi/cezmi     0 2025-04-20 10:00 ProjeA/
    drwxr-xr-x cezmi/cezmi     0 2025-04-20 10:00 ProjeA/belgeler/
    -rw-r--r-- cezmi/cezmi   150 2025-04-20 09:55 ProjeA/belgeler/README.md
    lrwxrwxrwx cezmi/cezmi     0 2025-04-20 10:05 ProjeA/testler -> ../../test_betikleri # 'l' harfi symlink olduğunu gösterir
    -rw-r--r-- cezmi/cezmi   300 2025-04-20 09:58 ProjeA/testler/test1.py
    -rw-r--r-- cezmi/cezmi  1200 2025-04-20 09:50 ProjeA/ana_kod.py

tar - Arşivi Açma (-x)

  • -x: xtract - Arşivdeki dosyaları dışarı çıkarır.

  • -v: verbose - Çıkarılan dosyaları listeler.

  • -f: file - Açılacak arşiv dosyasının adı.

  • -p (genellikle varsayılan): İzinleri ve sahiplik bilgilerini koruyarak çıkarır.

  • Örnek:

    # Önce eski dizini silelim
    cezmi@ubuntu:~/Belgeler$ rm -rf ProjeA
    # Arşivi açalım
    cezmi@ubuntu:~/Belgeler$ tar -xvf projeA.tar
    ProjeA/
    ProjeA/belgeler/
    ProjeA/belgeler/README.md
    ProjeA/testler -> ../../test_betikleri
    ProjeA/testler/test1.py
    ProjeA/ana_kod.py

tar - Arşivi Farklı Dizine Açma (-C)

  • -C hedef_dizin (Büyük C): Arşivi belirtilen hedef_dizin içine açar. Dizin mevcut olmalıdır. Bu seçenek sonda yer alır.

  • Örnek:

    # /tmp dizini altına yeni bir dizin oluşturup oraya açalım
    cezmi@ubuntu:~/Belgeler$ mkdir /tmp/cikartilan_arsiv
    cezmi@ubuntu:~/Belgeler$ tar -xvf projeA.tar -C /tmp/cikartilan_arsiv/
    ProjeA/
    ... (çıkarılan dosyalar listelenir) ...
    ProjeA/ana_kod.py
    
    cezmi@ubuntu:~/Belgeler$ ls /tmp/cikartilan_arsiv/
    ProjeA

tar - Hariç Tutma (--exclude)

  • --exclude=PATTERN: Belirtilen kalıba uyan dosyaları/dizinleri arşive dahil etmez.

  • Örnek:

    # ProjeA'yı arşivle ama '.git' dizinini ve tüm '.log' dosyalarını hariç tut
    tar -cvf proje.tar --exclude='.git' --exclude='*.log' ProjeA/

Sıkıştırma Araçları: gzip, bzip2, xz

Tekil dosyaları veya tar arşivlerini sıkıştırırlar.

Araç tar Seçeneği Uzantı Hız Sıkıştırma Oranı Notlar
gzip -z .gz Hızlı İyi En yaygın, iyi denge.
bzip2 -j .bz2 Yavaş Daha İyi gzip’den daha iyi sıkıştırır.
xz -J (Büyük J) .xz Çok Yavaş En İyi Modern, en iyi sıkıştırma. Çok yaygın.
  • Sıkıştırma Seviyesi: -1 (en hızlı) … -9 (en iyi sıkıştırma).
  • tar ile kullanırken: GZIP=-9 tar -czvf ... veya XZ_OPT=-9 tar -cJvf ...

tar ile Sıkıştırılmış Arşiv Oluşturma

En yaygın kullanım: tar + sıkıştırma bir arada.

  • gzip: -z. Uzantı: .tar.gz veya .tgz

    tar -czvf projeA.tar.gz ProjeA/
  • bzip2: -j. Uzantı: .tar.bz2

    tar -cjvf projeA.tar.bz2 ProjeA/
  • xz: -J. Uzantı: .tar.xz

    tar -cJvf projeA.tar.xz ProjeA/
  • -c: Create, -v: Verbose, -f: File, -z/-j/-J: Sıkıştırma.

Sıkıştırılmış Arşivleri Açma

  • Otomatik Algılama: Modern tar, uzantıdan sıkıştırmayı anlar (-z/-j/-J genelde gereksiz).

    tar -xvf projeA.tar.gz
    tar -xvf projeA.tar.bz2
    tar -xvf projeA.tar.xz
  • Açıkça Belirtmek (Gerekirse): tar -xzvf ..., tar -xjvf ..., tar -xJvf ...

  • Farklı dizine açmak için -C hedef_dizin kullanılır.

Sıkıştırılmış İçeriği Görüntüleme/Arama

  • Görüntüleme (Açmadan):
    • zcat dosya.gz (veya gzcat)
    • bzcat dosya.bz2
    • xzcat dosya.xz
  • Arama (Açmadan):
    • zgrep "desen" dosya.gz
    • bzgrep "desen" dosya.bz2
    • xzgrep "desen" dosya.xz

Büyük Arşivleri Parçalama

Çok büyük arşivleri taşımak veya limitli sistemlerde kullanmak için bölebilirsiniz.

  • split ile:

    # Arşivi oluştururken pipe ile split'e gönder, 100MB'lık parçalara böl
    tar -czf - BuyukDizin/ | split -b 100M - arsiv.tar.gz.part_
    
    # Birleştirmek için:
    cat arsiv.tar.gz.part_* > birlesik_arsiv.tar.gz
    tar -xzf birlesik_arsiv.tar.gz
  • zip ile:

    # 100MB'lık parçalar halinde zip oluştur
    zip -s 100m -r buyuk_arsiv.zip BuyukDizin/
    # Açmak için 'unzip' yeterlidir.

zip / unzip - Windows Uyumu

  • Windows’da yaygın, platformlar arası uyumluluğu yüksek format.
  • Genellikle tar+sıkıştırma kadar verimli değil ve Unix izinlerini/bağlantılarını tam korumaz.
  • Kurulum: sudo apt install zip unzip (gerekirse).

zip - Arşiv Oluşturma

  • zip <arşiv_adı.zip> <dosya1> ...: Dosyaları sıkıştırır.

  • -r: recursive - Dizinleri ve içindekileri eklemek için GEREKLİDİR!

  • Örnek:

    # Dosyaları ve ProjeA dizinini zipleyelim
    zip -r paketim.zip metin1.txt ProjeA/

unzip - Arşiv Açma ve Listeleme

  • unzip <arşiv_adı.zip>: Mevcut dizine açar (üzerine yazmadan önce sorar).
  • unzip -l <arşiv_adı.zip>: list - İçeriği açmadan listeler.
  • unzip <arşiv_adı.zip> -d <hedef_dizin>: directory - Belirtilen dizine açar.

Şifreleme ve Parola Koruma

  • tar, gzip, bzip2, xz yerleşik şifreleme sağlamaz!

  • zip: Basit parola koruması sunar (-e). Güvenli değildir!

    zip -e gizli.zip gizli_dosya.txt # Parola soracaktır
  • Güçlü Şifreleme İçin: Hassas veriler için ek araçlar kullanılmalıdır:

    • gpg -c arsiv.tar.gz (Simetrik şifreleme -> arsiv.tar.gz.gpg)
    • 7z a -p<Parola> -mhe=on arsiv.7z dosyalar... (7z ile dosya adları da şifrelenir)
    • openssl enc ... (Daha karmaşık)

Güvenlik Uyarısı

Hassas verileri asla sadece zip -e ile korumayın! gpg veya 7z gibi güçlü şifreleme yöntemleri kullanın.

Modern Alternatif: 7z / p7zip

  • 7z (7-Zip), yüksek sıkıştırma oranı (.7z), çoklu format desteği ve güçlü AES-256 şifreleme sunar.

  • Linux’ta genellikle p7zip-full paketi ile kurulur: sudo apt install p7zip-full

  • Kullanım:

    # Arşiv oluşturma (.7z)
    7z a arsiv.7z Dizinim/ dosya.txt
    
    # Arşiv açma
    7z x arsiv.7z -o/hedef/dizin # -o ile hedef dizin
    
    # Parola ile şifreli arşiv oluşturma (Dosya adları da şifrelenir: -mhe=on)
    7z a -pMYsUpErSeCrEtPaSsWoRd -mhe=on guvenli_arsiv.7z GizliDizin/

Farklı Platformlarda Arşiv Açma

  • Linux/macOS: .zip, .tar, .gz, .bz2, .xz, .7z genellikle dahili veya kolayca kurulabilen araçlarla açılır.
  • Windows:
    • .zip dahili olarak desteklenir.
    • Diğer formatlar için 7-Zip (https://www.7-zip.org/) şiddetle tavsiye edilir (Ücretsiz ve Açık Kaynak).
  • Uyumluluk: Eski sistemlerde .xz veya .bz2 desteği olmayabilir. En geniş uyumluluk için .zip veya .tar.gz düşünülebilir.

Sıkıştırma Oranları ve Hızları: Deneyin!

Farklı yöntemlerin performansını görmek için kendiniz test edin:

  1. Büyük bir dizin veya dosya seçin.

  2. Aşağıdaki komutları time ile çalıştırıp süreyi ve oluşan arşiv boyutunu (ls -lh) karşılaştırın:

    time tar -cf test.tar Dizinim/
    time tar -czf test.tar.gz Dizinim/
    time tar -cjf test.tar.bz2 Dizinim/
    time tar -cJF test.tar.xz Dizinim/ # Büyük F = --force-local
    time zip -r test.zip Dizinim/
    time 7z a test.7z Dizinim/
    ls -lh test.*
  • Gözlemler: Hangi yöntem en hızlı? Hangisi en küçük dosyayı üretti?

Sıkça Sorulan Sorular (SSS)

  • Arşiv açarken mevcut dosyaların üzerine yazar mı?
    • Genellikle evet. Dikkatli olun! (unzip sorabilir, tar için --keep-old-files).
  • Arşiv bozuk mu nasıl anlarım?
    • Test seçenekleri: gzip -t, bzip2 -t, xz -t, unzip -t, 7z t.
  • Arşivden sadece belirli dosyaları nasıl çıkarırım?
    • Komutun sonuna çıkarılacak dosya/dizin yollarını ekleyin:
    • tar -xvf arsiv.tar dosya/yolu/icinden
    • unzip arsiv.zip dosya/yolu/icinden
    • 7z x arsiv.7z dosya/yolu/icinden

Pratik Zamanı!

Bu konuyu pekiştirmek için aşağıdaki adımları deneyin:

  1. İçinde çeşitli dosyalar, alt dizinler ve bir sembolik bağlantı olan bir test dizini oluşturun.
  2. Bu dizini hem .tar.gz hem de .tar.xz olarak arşivleyin (-v ile). Boyutları karşılaştırın.
  3. Arşivlerin içeriğini açmadan listeleyin (-t). İzinleri/bağlantıyı gözlemleyin.
  4. Arşivleri farklı bir dizine (/tmp gibi) açın (-C).
  5. Bir dosyayı zip ile parola korumalı olarak arşivleyin (-e). (Güvensiz olduğunu unutmayın!)
  6. Aynı dizini 7z ile arşivleyin. Boyutunu diğerleriyle karşılaştırın.
  7. Oluşturduğunuz .tar.gz arşivini Windows’ta (varsa) 7-Zip ile açmayı deneyin.

Özet: Sık Kullanılan Komutlar (Genişletilmiş)

Komut Açıklama Notlar
tar -cvf Arşiv oluştur (verbose) İzinleri/sahipliği/linkleri korur
tar -tvf Arşiv içeriğini listele (verbose)
tar -xvf Arşivi aç (verbose) İzinleri korur, üzerine yazabilir
tar -czvf gzip ile sıkıştırılmış arşiv oluştur (.tar.gz) Hızlı, yaygın
tar -cjvf bzip2 ile sıkıştırılmış arşiv oluştur (.tar.bz2) Daha iyi sıkıştırma, yavaş
tar -cJvf xz ile sıkıştırılmış arşiv oluştur (.tar.xz) En iyi sıkıştırma, modern, yavaş
tar -C dir Arşivi farklı dizine aç Seçenek sonda olmalı
--exclude Dosya/Dizini arşivden hariç tut
zcat/bzcat/xzcat Sıkıştırılmış dosya içeriğini göster cat gibi ama sıkıştırılmış için
zgrep/bzgrep/xzgrep Sıkıştırılmış dosyada ara grep gibi ama sıkıştırılmış için
zip -r Dizinlerle birlikte .zip arşivi oluştur Windows uyumu yüksek
unzip .zip arşivini aç -l listele, -d hedef dizin
zip -e Parola korumalı .zip oluştur Güvenli değil!
split -b Dosyayı belirtilen boyutta parçalara böl cat ile birleştirilir
7z a 7z arşivi oluştur (yüksek sıkıştırma) -p parola, -mhe=on ad şifreleme
7z x 7z arşivini aç -o hedef dizin
gzip/bzip2/xz -t Sıkıştırılmış dosyanın bütünlüğünü test et unzip -t, 7z t