Bu makalede, arşiv dosyalarını disk alanına kaydetmeden indirme ve çıkarma yöntemlerini inceleyeceğiz.
Problemin Tanımı
Bir arşiv dosyasının içeriğini internetten almak genellikle iki adım içerir. Öncelikle, arşiv dosyasını indirip diske kaydetmemiz gerekir. Bu işlem, wget
veya curl
gibi HTTP istemci komut satırı araçları kullanılarak yapılabilir. Ardından, arşivi çıkararak içindeki dosya, dizin ve verileri elde ederiz.
Çoğu durumda, arşiv dosyası içeriğini aldıktan sonra artık gereksiz hale gelir. Bu nedenle, genellikle arşiv dosyasını silerek disk alanı boşaltma işlemi yapılır. Ancak, nihayetinde istediğimiz sadece arşivin içeriğidir ve arşiv dosyasının kendisi değildir. Bu durumda, arşiv dosyasını diske yazmak gereksiz görünüyor. Peki, arşiv dosyasını tamamen kaydetmeden arşiv dosyasının içeriğini nasıl elde edebiliriz?
Bunu Linux pipe yapısı kullanarak nasıl gerçekleştirebileceğimize bakalım.
Pipe ile Anlık Çıkarma
Fikir, arşiv dosyasını indirirken parça parça çıkarmaktır. Yani, indirdiğimiz arşiv dosyasının baytlarını çıkarma sürecine yönlendirebiliriz. Bu, çıkarma sürecinin indirme işlemiyle aynı anda çalışmasını sağlar, bu da daha verimli hale getirir.
Ayrıca, arşiv dosyasını silme işlemi için ayrı bir komut çalıştırma yükünden de kurtulmuş oluruz. Sonuç olarak, arşiv dosyalarını diske yazmadığımız için disk I/O işlemlerinden tasarruf sağlarız. Bu durum, kullanım bazlı faturalandırma yapılan bulut tabanlı kaynaklarda çalışırken özellikle önemlidir.
1. .tar.gz Dosyasını Çıkarma
Örneğin, Cpynet web sitesinde barındırılan 1 milyar kelimelik dil modelleme benchmark dosyasını indirelim. Bu dosya 1.7GB boyutundadır ve .tar.gz formatındadır.
Arşiv içeriğini çıkarmak için wget
ve tar
komutunu bir arada kullanarak tek bir satırda işlem yapabiliriz:
wget -qO- https://cpynet.com.tr/lm-benchmark/1-billion-word-language-modeling-benchmark-r13output.tar.gz | tar xvz
Çıktı:
- Çıktı, arşiv dosyasının içindeki dosyaların adlarını gösterecektir. Örneğin:
x 1-billion-word-language-modeling-benchmark-r13output/
x 1-billion-word-language-modeling-benchmark-r13output/file1.txt
x 1-billion-word-language-modeling-benchmark-r13output/file2.txt
Burada, wget
komutu arşiv dosyasını indirir ve standart çıkış akışına yönlendirir. -O-
seçeneği ile indirdiğimiz baytları standart çıkışa yazıyoruz. Ayrıca, -q
seçeneği, wget
komutunun standart çıkışta başka mesajlar yazmasını engeller.
Komutun ikinci kısmı, standart girdi akışında bulunan indirilen baytları tar
komutuna yönlendirir. tar
komutu, arşivi çıkarır ve içeriği mevcut dizine yerleştirir. -xz
seçeneği çıkarma ve sıkıştırmayı açma işlemlerini gerçekleştirirken, -v
seçeneği ise ayrıntılı modu aktif hale getirir.
Ayrıca, curl
komutunu da kullanarak işlemi gerçekleştirebiliriz:
curl -s -L https://cpynet.com.tr/lm-benchmark/1-billion-word-language-modeling-benchmark-r13output.tar.gz | tar xvz
Çıktı:
- Çıktı, yukarıda belirtildiği gibi, çıkarılan dosyaların adlarını gösterecektir.
2. .zip Dosyasını Çıkarma
Cpynet web sitesinde barındırılan bir .zip dosyasını çıkaralım. Zip dosyası, arşiv dosyasının sonunda bir dizin dosyası bulundurur. Bu dizin dosyası, arşivin içeriği hakkında bilgi içerir ve çıkarıcıya nereden bakacağını söyler. Bu yapı, çıkarıcının tam arşiv dosyasına ihtiyaç duyması nedeniyle bir sorun gibi görünmektedir. Ancak, bsdtar
gibi araçlar, bu gerçeği kullanarak .zip dosyalarını pipe üzerinden çıkarabilir.
wget -qO- https://cpynet.com.tr/dc/enwik9.zip | bsdtar -xvf-
Çıktı:
- Çıktı, çıkarılan dosyaların adlarını gösterecektir. Örneğin:
x enwik9
bsdtar
komutundaki -f-
seçeneği, çıkarma işleminin standart girişten geldiğini belirtir. -x
seçeneği çıkarma işlemini tanımlarken, -v
seçeneği komuttan tanımsal mesajlar almak için ayrıntılı modunu etkinleştirir.
Sonuç
Bu makalede, Linux’ta arşivleri disk alanına kaydetmeden indirip çıkarma yöntemlerini inceledik. Özellikle, arşiv dosyası baytlarını çıkarıcıya yönlendirerek arşiv dosyasının tamamını beklemeden içerik elde edebiliriz. Bunun sonucunda, disk alanını optimize eder, işleme süresini azaltır ve I/O işlemlerini minimize ederiz.