İçeriğe geç
academia.sh

Ders 10 / 20

Arşivleme ve Sıkıştırma

Arşivlemenin sıkıştırmadan ayrılması, arşiv biçiminin üstveri taşıması, sıkıştırma algoritmalarının oran–maliyet ödünleşimi ve açmadan önce içeriği doğrulama.

İçindekiler

Ağacı tek bir dosyaya paketleme sorusu, önceki dersin bıraktığı yerden başlar ve hemen üç alt soruya ayrılır: dizin yapısı düz bir bayt dizisine nasıl çevrilir, izinler ile zaman damgaları korunur mu, sembolik bağlar hedeflerinin içeriğiyle mi yoksa yol dizeleriyle mi saklanır?

Bu ders önce iki işlemi birbirinden ayırır — çoğu araç ikisini birlikte yaptığı için karıştırılırlar — sonra arşivlerin nasıl doğrulanacağını kurar.

İki Ayrı İşlem

Arşivleme, birden çok dosyayı üstverileriyle birlikte tek bir bayt dizisine dönüştürmektir. Boyut küçültmez; hatta biraz büyütür.

Sıkıştırma, tek bir bayt dizisini daha kısa bir gösterimle yeniden kodlamaktır. Dosya sayısını değiştirmez.

Ayrım, Unix geleneğinin “küçük araçlar, tek iş” varsayımının doğrudan bir sonucudur. Her sıkıştırma algoritması her arşiv biçimiyle birleştirilebilir; iki iş tek programda birleştirilseydi bu serbestlik kaybolurdu.

Arşiv biçimi, dosya içeriklerinin önüne birer başlık bloğu koyar. Başlıkta ad, boyut, izinler, sahiplik, zaman damgası ve dosya türü bulunur. Bu nedenle arşivden çıkan dosyalar yalnızca içeriklerini değil üstverilerini de geri kazanır — sıradan bir birleştirme işleminin yapamayacağı şey budur.

$ tar -cf arsiv/veri.tar veri
$ ls -l arsiv
total 56
drwxr-xr-x 2 ogrenci ogrenci  4096 Jul 26 19:04 ham-yedek
-rw-r--r-- 1 ogrenci ogrenci 51200 Jul 26 19:10 veri.tar

Seçenekler işlemi belirler: -c arşiv oluşturur, -f arşiv dosyasının adını verir. Argüman olarak verilen veri dizini özyinelemeli olarak alınır.

Arşiv boyutunun içeriğin toplamından büyük olması beklenen bir sonuçtur. Biçim sabit uzunlukta bloklar kullanır ve arşivin sonuna dolgu ekler; küçük dosyalarda bu dolgu, veriden büyük olabilir.

Arşivin İçini Görmek

Bir arşivi açmadan önce içeriğini listelemek, uygulanması gereken bir alışkanlıktır:

$ tar -tvf arsiv/veri.tar
drwxr-xr-x ogrenci/ogrenci   0 2026-07-26 19:08 veri/
drwxr-xr-x ogrenci/ogrenci   0 2026-07-26 19:03 veri/islenmis/
-rw-r--r-- ogrenci/ogrenci  47 2026-07-26 19:03 veri/islenmis/olcum-01.csv
-rw-r--r-- ogrenci/ogrenci  47 2026-07-26 19:03 veri/islenmis/gunluk-ozet.csv
drwxr-xr-x ogrenci/ogrenci   0 2026-07-26 19:10 veri/ham/
-rw-r--r-- ogrenci/ogrenci  47 2026-07-26 19:02 veri/ham/olcum-01.csv
-rw-r--r-- ogrenci/ogrenci  47 2026-07-26 19:03 veri/ham/olcum-02.csv
-rw-r--r-- ogrenci/ogrenci 42019 2026-07-26 19:10 veri/ham/olcum-04.csv
-rw-r--r-- ogrenci/ogrenci    47 2026-07-26 19:03 veri/ham/olcum-03.csv
lrwxrwxrwx ogrenci/ogrenci     0 2026-07-26 19:08 veri/guncel.csv -> ham/olcum-03.csv

-t listeler, -v ayrıntı ekler. Çıktı, önceki derslerde kurulan her şeyi doğrular. İzinler ve sahiplik korunmuştur. Zaman damgaları korunmuştur. Son satırdaki sembolik bağ, hedefinin kopyası olarak değil, bağ olarak saklanmıştır: tür karakteri l, boyut 0 ve hedef yol dizesi görünüyor.

Sembolik bağların izlenmesi isteniyorsa -h seçeneği verilir; bu durumda arşive bağ değil hedefin içeriği girer ve arşiv büyür. Ağaç bütün olarak taşınıyorsa varsayılan davranış doğrudur — bağ da hedefi de arşivdedir ve göreli hedef çözümlenmeye devam eder.

Listeleme alışkanlığının nedeni, arşivlerin kendi dizin yapılarını taşımasıdır. İyi biçimlendirilmiş bir arşiv tek bir üst dizin içerir ve açıldığında yalnızca onu oluşturur. Böyle olmayan bir arşiv, onlarca dosyayı doğrudan bulunulan dizine boşaltır ve aynı adlı dosyaların üzerine yazar. Açmadan önce listelemek bu durumu önceden gösterir.

Mutlak Yolların Kaldırılması

Arşive mutlak yolla dosya eklenirse araç baştaki eğik çizgiyi kaldırır ve uyarır:

$ tar -cf /tmp/mutlak.tar /home/ogrenci/proje/belge
tar: Removing leading `/' from member names
$ tar -tf /tmp/mutlak.tar
home/ogrenci/proje/belge/

Bu davranış bir güvenlik önlemidir. Mutlak yollar korunsaydı, arşiv açan bir kullanıcı sistem dosyalarının üzerine yazan bir arşiv alabilirdi. Yollar göreli tutulduğunda, arşiv en fazla açıldığı dizinin altını etkiler.

Uyarının pratik sonucu, arşivlerin ağacın üstünde durup göreli yolla oluşturulmasıdır: tar -cf arsiv/veri.tar veri komutu veri/ ile başlayan yollar üretir ve nereye açılırsa açılsın orada bir veri dizini oluşturur.

Arşivden Çıkarma

-x seçeneği çıkarır, -C hedef dizini belirler:

$ mkdir -p /tmp/geri
$ tar -xf arsiv/veri.tar -C /tmp/geri
$ find /tmp/geri | sort
/tmp/geri
/tmp/geri/veri
/tmp/geri/veri/guncel.csv
/tmp/geri/veri/ham
/tmp/geri/veri/ham/olcum-01.csv
/tmp/geri/veri/ham/olcum-02.csv
/tmp/geri/veri/ham/olcum-03.csv
/tmp/geri/veri/ham/olcum-04.csv
/tmp/geri/veri/islenmis
/tmp/geri/veri/islenmis/gunluk-ozet.csv
/tmp/geri/veri/islenmis/olcum-01.csv
$ ls -l /tmp/geri/veri/guncel.csv
lrwxrwxrwx 1 ogrenci ogrenci 16 Jul 26 19:08 /tmp/geri/veri/guncel.csv -> ham/olcum-03.csv

Ağaç eksiksiz geri gelmiştir ve sembolik bağ bağ olarak yeniden kurulmuştur. Göreli hedefi sayesinde yeni konumunda da çözümlenir — bağlantılar dersindeki göreli hedef tercihinin karşılığı burada alınır.

-C seçeneği, arşivi bulunulan dizine boşaltma riskini ortadan kaldırır: çıkarma işlemi her zaman boş veya bu iş için ayrılmış bir dizine yapılır.

Sıkıştırma Algoritmaları

Sıkıştırma araçları tek bir dosya üzerinde çalışır ve genellikle özgün dosyanın yerine sıkıştırılmışını koyar; -k seçeneği özgün dosyayı korur.

Üç yaygın algoritmanın aynı veri üzerindeki sonucu:

$ gzip -k /tmp/o4.csv
$ bzip2 -k /tmp/o4.csv
$ xz -k /tmp/o4.csv
$ ls -l /tmp/o4.csv*
-rw-r--r-- 1 ogrenci ogrenci 42019 Jul 26 19:10 /tmp/o4.csv
-rw-r--r-- 1 ogrenci ogrenci  5579 Jul 26 19:10 /tmp/o4.csv.bz2
-rw-r--r-- 1 ogrenci ogrenci 10776 Jul 26 19:10 /tmp/o4.csv.gz
-rw-r--r-- 1 ogrenci ogrenci  2444 Jul 26 19:10 /tmp/o4.csv.xz

Aynı 42019 baytlık ölçüm dosyası sırasıyla 10776, 5579 ve 2444 bayta inmiştir. Sıralama rastlantı değildir; algoritmaların tasarım tercihlerinden çıkar.

Araç Yaklaşım Ödünleşim
gzip Sözlük tabanlı kodlama, küçük pencere En hızlı, en düşük oran, en yaygın destek
bzip2 Blok sıralama dönüşümü Orta hız, orta oran
xz Sözlük tabanlı kodlama, çok büyük pencere En yavaş ve en çok bellek, en yüksek oran

Ortak ilke şudur: daha yüksek sıkıştırma oranı, daha uzun geçmişte örüntü aramayı gerektirir; bu da daha çok bellek ve daha çok işlem demektir. Algoritmaların hiçbiri diğerinden “iyi” değildir; farklı noktalarda durur.

Seçim ölçütü, verinin kaç kez sıkıştırılıp kaç kez açılacağıdır. Bir kez üretilip çok kez indirilen bir arşivde sıkıştırma maliyeti bir kez ödenir ve yüksek oran kazançlıdır. Sık üretilen günlük yedeklerde ise sıkıştırma süresi her seferinde ödenir.

Sıkıştırılamayan veri de vardır: zaten sıkıştırılmış görüntü ve ses biçimleri, şifrelenmiş dosyalar ve rastgele veriler. Bunları sıkıştırmak boyutu küçültmez, bir miktar büyütür — çıktının en az girdi kadar bilgi taşıması gerektiği için.

Arşiv ve Sıkıştırmayı Birleştirmek

Araç, arşivlemeyi ve sıkıştırmayı tek komutta zincirleyebilir:

$ tar -czf arsiv/veri.tar.gz veri
$ tar -cJf arsiv/veri.tar.xz veri
$ ls -l arsiv
total 76
drwxr-xr-x 2 ogrenci ogrenci  4096 Jul 26 19:04 ham-yedek
-rw-r--r-- 1 ogrenci ogrenci 51200 Jul 26 19:10 veri.tar
-rw-r--r-- 1 ogrenci ogrenci 11330 Jul 26 19:10 veri.tar.gz
-rw-r--r-- 1 ogrenci ogrenci  4416 Jul 26 19:10 veri.tar.xz

-z gzip, -j bzip2, -J xz uygular. Uzantı geleneği sırayı yansıtır: .tar.gz, önce arşivlenip sonra sıkıştırılmış demektir.

Sıranın önemi vardır. Önce arşivleyip sonra sıkıştırmak, dosyalar arasındaki tekrarların da bulunmasını sağlar; ölçüm dosyaları aynı başlık satırını ve benzer sayı örüntülerini paylaştığı için bu kazanç gerçektir. Karşılığında tek bir dosyayı okumak için arşivin başından itibaren açmak gerekir. Her dosyayı ayrı sıkıştırmak ise rastgele erişimi korur ama dosyalar arası tekrarı kaçırır.

Arşivlerdeki dolgu, sıkıştırmanın oranını da yanıltıcı biçimde yükseltir: 51200 baytlık arşivin 4416 bayta inmesinin bir bölümü, verinin değil dolgunun sıkışmasıdır. Sıkıştırma oranı değerlendirilirken ölçüt, arşivin değil özgün verinin boyutudur.

Arşivler hazır olduğuna göre, önceki derste bırakılan dizin kopyası gereksizdir:

$ rm -r arsiv/ham-yedek
$ ls -l arsiv
total 72
-rw-r--r-- 1 ogrenci ogrenci 51200 Jul 26 19:10 veri.tar
-rw-r--r-- 1 ogrenci ogrenci 11330 Jul 26 19:10 veri.tar.gz
-rw-r--r-- 1 ogrenci ogrenci  4416 Jul 26 19:10 veri.tar.xz

Arşivin dizin kopyasına üstünlüğü, tek dosya olması değil üstveriyi ve bağ yapısını bir zaman noktasında dondurmasıdır.

Taşınabilirlik Notu

Arşiv aracının iki yaygın gerçekleştirimi vardır ve seçenek kümeleri birebir aynı değildir. Yukarıdaki -c, -t, -x, -f, -v, -C seçenekleri ikisinde de aynı anlamdadır. Sıkıştırma kısayolları (-z, -j, -J) yaygındır ama standart değildir; taşınabilir betiklerde sıkıştırma ayrı bir adım olarak boru hattıyla uygulanır.

Eski gerçekleştirimlerde seçenekler tire olmadan da yazılabilir (tar cf). Bu biçim çalışmayı sürdürür; tireli biçim yazılı belgelerde tercih edilir.

Özet

  • Arşivleme çok dosyayı üstverisiyle birlikte tek bayt dizisine çevirir; sıkıştırma tek bir bayt dizisini kısaltır. İki işlem ayrıdır ve bağımsız birleştirilebilir.
  • Arşiv başlıkları izin, sahiplik, zaman damgası ve dosya türünü taşır; sembolik bağlar hedef dizeleriyle saklanır.
  • Arşiv açılmadan önce listelenir; mutlak yollar kaldırılır ve çıkarma -C ile ayrılmış bir dizine yapılır.
  • Sıkıştırma oranı arttıkça bellek ve işlem maliyeti artar; seçim, verinin kaç kez sıkıştırılıp kaç kez açılacağına bağlıdır.
  • Önce arşivleyip sonra sıkıştırmak dosyalar arası tekrarı yakalar ama rastgele erişimi kaybettirir.
  • Zaten sıkıştırılmış veya rastgele veri sıkıştırılamaz; çıktı bir miktar büyür.

Sonraki Adım

Arşiv tek dosya hâline geldiğine göre başka bir makineye gönderilebilir. Ancak her seferinde tüm ağacı arşivleyip göndermek, ağacın küçük bir bölümü değiştiğinde savurgandır. Sonraki ders uzak kopyalama ile eşitleme araçlarını ele alır: bağlantı nasıl kurulur, hangi araç yalnızca değişeni gönderir ve yol sonundaki eğik çizgi neden sonucu değiştirir?

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat