# Bash ile Birden Çok Dosyanın Toplam Boyutunu Bulma
Bir web geliştiricisi olarak, sunucudaki log dosyalarının toplam boyutunu düzenli olarak kontrol etmeniz gerekiyor. Ya da bir veri bilimcisi olarak, analiz için topladığınız petabaytlarca veriyi yönetmeli ve toplam disk kullanımını izlemelisiniz. Bu gibi durumlarda, yüzlerce hatta binlerce dosyanın toplam boyutunu tek tek kontrol etmek imkansızdır. İşte tam bu noktada Bash betikleri devreye giriyor. Bu makalede, Bash kullanarak bir dosya listesinin toplam boyutunu nasıl hesaplayacağınızı, performans optimizasyonunu nasıl yapacağınızı ve karşılaşabileceğiniz zorlukları nasıl aşacağınızı adım adım öğreneceksiniz.
Bash Temelleri: Dosya Boyutu ve Toplama İşlemleri
Bash betikleri, Linux ve benzeri sistemlerde komut satırı üzerinden otomasyon sağlayan güçlü araçlardır. Dosya boyutunu öğrenmek için du (disk usage) komutu kullanılırken, toplama işlemleri için awk veya bc gibi araçlar kullanılır. Örneğin, tek bir dosyanın boyutunu öğrenmek için du -sh dosya_adi komutunu kullanabilirsiniz. -s seçeneği özet bilgisi verirken, -h seçeneği insan tarafından okunabilir bir birim (KB, MB, GB vb.) kullanılmasını sağlar. Ancak birden fazla dosyanın toplam boyutunu hesaplamak için daha karmaşık bir yaklaşım gereklidir.
Örnek: du -sh dosya1.txt dosya2.txt komutu, dosya1.txt ve dosya2.txt dosyalarının ayrı ayrı boyutlarını gösterir. Toplam boyutu elde etmek için ek bir işlem yapmanız gerekir. Bu işlemi awk ile kolayca yapabiliriz.
Nasıl Yapılır? Yeni Başlayanlar İçin Adım Adım Rehber
İlk olarak, dosya isimlerini içeren bir liste oluşturalım. Bu liste, bir metin dosyasında (dosya_listesi.txt) veya doğrudan komut satırında belirtilebilir. Aşağıda, bir metin dosyasında listeyi kullanarak toplam boyut hesaplamanın basit bir örneği verilmiştir:
Adım 1: Dosya listesini oluşturun. dosya_listesi.txt adlı bir dosya oluşturun ve içine her satıra bir dosya adı yazın:
dosya1.txt
dosya2.txt
resim1.jpg
video.mp4
Adım 2: Aşağıdaki Bash betiğini kullanın:
#!/bin/bash
toplam_boyut=0
while IFS= read -r dosya; do
boyut=$(du -sb "$dosya" | awk '{print $1}')
toplam_boyut=$((toplam_boyut + boyut))
done < dosya_listesi.txt
echo "Toplam boyut: $(du -sh <<<"$toplam_boyut")"
Bu betik, dosya_listesi.txt dosyasındaki her dosya için du -sb komutunu kullanarak bayt cinsinden boyutunu alır ve toplam_boyut değişkenine ekler. Son olarak, toplam boyutu insan tarafından okunabilir bir formatta ekrana yazar.
Gerçek Hayat Örneği ve Optimizasyon İpuçları (Orta Seviye)
Diyelim ki bir web sunucusunda günlük olarak oluşturulan log dosyalarının toplam boyutunu izlemek istiyorsunuz. Bu dosyalar /var/log/apache2 dizininde bulunuyor ve her gün yeni dosyalar ekleniyor. Bu durumda, yukarıdaki basit yaklaşım yetersiz kalabilir. Daha verimli bir çözüm, find komutu ile dosyaları filtrelemek ve xargs ile du komutunu paralel çalıştırmaktır:
find /var/log/apache2 -type f -name "*.log" -print0 | xargs -0 -I {} du -sb {} | awk '{sum += $1} END {print sum}'
Bu komut, /var/log/apache2 dizinindeki tüm .log dosyalarını bulur, xargs ile du komutunu her dosya için paralel olarak çalıştırır ve awk ile toplam boyutu hesaplar. Bu yöntem, özellikle çok sayıda dosya ile çalışırken önemli bir performans artışı sağlar. Ayrıca, find komutunun -print0 ve xargs‘ın -0 seçenekleri, dosya isimlerinde boşluk veya özel karakter bulunması durumunda sorunları önler. Performans Optimizasyonu: xargs‘ın -P seçeneği ile paralel işlem sayısını belirleyerek performansı daha da artırabilirsiniz. Sisteminizin kaynaklarına göre bu sayıyı ayarlayabilirsiniz.
İleri Düzey Teknikler: Performans Analizi ve Edge Case’ler
Çok büyük sayıda dosya ile çalışırken, yukarıdaki yöntemler bile yeterince hızlı olmayabilir. Bu durumlarda, daha gelişmiş teknikler kullanmak gerekebilir. Örneğin, du komutunun --apparent-size seçeneği, dosyaların disk üzerinde kapladığı gerçek alanı gösterirken, varsayılan olarak kullanılan -s seçeneği, dosyaların mantıksal boyutunu gösterir. Bu iki değer arasında fark olabilir, özellikle de hard link’ler kullanılıyorsa.
Edge Case’ler: Sembolik linkler (symbolic links) ve hard link’ler toplam boyutu etkiler. du komutunun farklı seçenekleri bu durumları farklı şekilde ele alır. Doğru sonucu elde etmek için, kullandığınız du seçeneklerini ve dosya sisteminizin özelliklerini dikkatlice göz önünde bulundurmanız gerekir. Ayrıca, dosya isimlerinde özel karakterler bulunması durumunda, doğru kaçış karakterlerini kullanarak komutların doğru çalışmasını sağlamanız önemlidir.
Toplam Dosya Boyutunu Hesaplamanın Farklı Yolları
Yukarıda bahsedilen yöntemlere ek olarak, find komutu ile birleştirilmiş stat komutu da kullanılabilir. stat komutu, bir dosya hakkında detaylı bilgi sağlar ve bu bilgiyi kullanarak toplam boyutu hesaplayabiliriz. Ancak bu yöntem, du komutuna göre daha az verimli olabilir.
find /path/to/directory -type f -exec stat -c %s {} + | awk '{sum += $1} END {print sum}'
Bu komut, belirtilen dizindeki tüm dosyaların boyutlarını alır ve toplamını hesaplar.
Sıkça Sorulan Sorular
* Çok büyük dosyalar için ne yapmalıyım? Çok büyük dosyalar için, du komutunun --apparent-size seçeneğini kullanarak disk üzerinde kapladıkları gerçek alanı hesaplamanız daha doğru sonuçlar verebilir. Ayrıca, işlemi parçalara bölerek ve paralel olarak çalıştırarak performansı artırabilirsiniz.
* Dosya isimlerinde boşluk varsa ne olur? Dosya isimlerinde boşluk veya özel karakterler varsa, find komutunun -print0 ve xargs komutunun -0 seçeneklerini kullanmanız gerekir.
* Hata mesajları alıyorsam ne yapmalıyım? Hata mesajlarını dikkatlice inceleyin ve olası nedenleri araştırın. Dosya izinleri, dosya varlığı, komutların doğru kullanımı gibi konuları kontrol edin.
* Farklı dosya tiplerinin toplam boyutunu nasıl hesaplarım? find komutunun -type seçeneği ile dosya tiplerini filtreleyebilirsiniz. Örneğin, sadece .txt dosyalarının boyutunu hesaplamak için find . -type f -name "*.txt" ... komutunu kullanabilirsiniz.
* Toplam boyutu insan tarafından okunabilir bir birimde nasıl gösteririm? du komutunun -h seçeneğini veya numfmt komutunu kullanabilirsiniz. numfmt --to=iec komutu, baytları IEC birimlerine (KiB, MiB, GiB) dönüştürür.
Sonuç
Bash betikleri kullanarak bir dosya listesinin toplam boyutunu hesaplamak, özellikle büyük miktarda veri ile çalışırken oldukça faydalıdır. Bu makalede, yeni başlayanlardan ileri seviye kullanıcılara kadar farklı seviyelerde bilgi ve teknikler sunarak, bu işlemi verimli ve güvenilir bir şekilde gerçekleştirmenize yardımcı olmayı amaçladık. Doğru komutları ve teknikleri kullanarak, zaman ve kaynak tasarrufu sağlayabilirsiniz. Daha fazla ileri seviye Bash betikleme teknikleri için [fatihsoysal.com](https://fatihsoysal.com) adresini ziyaret edebilirsiniz.
Yazar: Fatih Soysal
