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
-Cile 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.