Büyük bir log dosyasını başka bir sunucuya taşımanız gerekiyor ama dosya 50GB ve tek parça transfer sürekli kesiliyor. Ya da bir backup arşivini FAT32 formatlı bir USB’ye kopyalamanız lazım ama 4GB sınırına takılıyorsunuz. İşte tam bu noktalarda split komutu hayat kurtarıcı oluyor. Linux’un bu mütevazı ama son derece güçlü aracını detaylıca inceleyelim.
split Komutu Nedir?
split, büyük dosyaları belirli boyutlarda veya belirli satır sayılarında küçük parçalara bölen bir GNU coreutils aracıdır. Neredeyse tüm Linux dağıtımlarında varsayılan olarak gelir, kurulum gerektirmez. Temel mantığı basittir: bir dosyayı alırsınız, boyut veya satır kriteriyle bölersiniz, ortaya çıkan parçaları istediğiniz gibi kullanırsınız.
Komutun temel söz dizimi şöyledir:
split [SEÇENEKLER] [DOSYA] [ÖNEK]
Herhangi bir seçenek vermeden çalıştırdığınızda split, dosyayı her biri 1000 satır olan parçalara böler ve xaa, xab, xac şeklinde isimlendirir.
Temel Parametreler
-b, –bytes=BOYUT: Dosyayı belirtilen byte boyutunda parçalara böler. K, M, G gibi çarpanlar kullanılabilir.
-l, –lines=SAYI: Dosyayı belirtilen satır sayısında parçalara böler.
-n, –number=ADET: Dosyayı belirtilen sayıda eşit parçaya böler.
-C, –line-bytes=BOYUT: Satırları kesmeden belirtilen boyuta kadar doldurur.
-d: Sayısal sonek kullanır (xaa yerine x00, x01 gibi).
–suffix-length=N: Sonek uzunluğunu belirler, varsayılan 2’dir.
-a: Suffix length için kısaltma, –suffix-length ile aynıdır.
–additional-suffix=SONEK: Parça dosyalarına ekstra uzantı ekler.
–verbose: İşlem sırasında hangi dosyanın oluşturulduğunu gösterir.
-e, –elide-empty-files: Boş çıktı dosyaları oluşturmaz.
–filter=KOMUT: Her parçayı ayrı bir komuta pipe eder.
Boyuta Göre Bölme
En sık kullanılan senaryo boyuta göre bölmedir. Diyelim ki 10GB’lık bir veritabanı yedeği var ve bunu 2GB’lık parçalara bölmeniz gerekiyor:
split -b 2G backup_db.tar.gz db_parca_
Bu komut db_parca_aa, db_parca_ab, db_parca_ac şeklinde dosyalar oluşturur. Boyut belirtirken kullanabileceğiniz çarpanlar şunlardır:
- b: 512 byte
- K veya k: 1024 byte (1 KB)
- M veya m: 1048576 byte (1 MB)
- G veya g: 1073741824 byte (1 GB)
Küçük dosyalar için MB kullanımına bakalım:
# 500MB'lık parçalar oluştur
split -b 500M buyuk_video.mp4 video_parca_
# 100MB'lık parçalar, sayısal sonek ile
split -b 100M -d access.log log_parca_
# Parça dosyalarına .part uzantısı ekle
split -b 1G --additional-suffix=.part sistem_yedek.tar backup_
Satır Sayısına Göre Bölme
Log analizi veya CSV işlemlerinde satır bazlı bölme çok daha mantıklıdır. Milyonlarca satırlık bir log dosyasını işlemeye çalışıyorsanız ve her worker için 100.000 satır ayırmanız gerekiyorsa:
# Her parçada 100.000 satır olsun
split -l 100000 uygulama.log log_segment_
# Satır sayısını verbose modda takip et
split -l 50000 --verbose buyuk_veri.csv csv_parca_
Verbose mod kullanmanızı tavsiye ederim, özellikle büyük dosyalarda işlemin nerede olduğunu görmek için oldukça yararlı:
split -l 10000 --verbose access_log.txt parca_
# Çıktı:
# creating file 'parca_aa'
# creating file 'parca_ab'
# creating file 'parca_ac'
Eşit Parçalara Bölme
Bazen dosyanın tam olarak kaç parçaya bölüneceğini bilmek istersiniz. -n seçeneği bu iş için biçilmiş kaftandır:
# Dosyayı tam 5 eşit parçaya böl
split -n 5 veri_seti.csv parca_
# Satır bazlı 10 eşit parçaya böl (l/ öneki ile)
split -n l/10 buyuk_metin.txt metin_parca_
l/ öneki satırları bölmeden, satır bütünlüğünü koruyarak eşit parçalar oluşturur. CSV dosyaları veya log dosyaları için bu önemlidir çünkü satır ortasında kesilme olmaz.
Gerçek Dünya Senaryoları
Senaryo 1: FAT32 USB’ye Büyük Yedek Kopyalama
FAT32 dosya sistemi 4GB’dan büyük tek dosyayı desteklemez. 15GB’lık bir yedek dosyanızı FAT32 USB’ye kopyalamanız gerektiğinde:
# Yedeği 3.9GB'lık parçalara böl
split -b 3900M sistem_yedek.tar.gz /media/usb/yedek_
# Parçaları listele ve toplam boyutu kontrol et
ls -lh /media/usb/yedek_*
# Hedefte birleştirmek için
cat yedek_* > sistem_yedek_geri.tar.gz
Birleştirme işleminde cat komutunu kullanıyoruz. split ile bölünen dosyalar cat ile mükemmel şekilde birleşir. Bu kombinasyon Linux’un Unix felsefesini en güzel yansıtan örneklerden biridir.
Senaryo 2: Ağ Transferinde Kararlılık
Büyük dosyaları tek parça transfer ettiğinizde bağlantı kesilirse baştan başlamak zorunda kalırsınız. Parça parça transfer çok daha güvenilirdir:
# Önce dosyayı böl
split -b 1G -d --additional-suffix=.part prod_backup.tar.gz backup_parca_
# Her parçayı ayrı ayrı rsync ile gönder (bir parça bozulursa sadece onu tekrarlarsınız)
for parca in backup_parca_*.part; do
rsync -avz --progress "$parca" kullanici@hedef-sunucu:/backup/
echo "$parca transfer tamamlandi"
done
# Hedef sunucuda birleştir
ssh kullanici@hedef-sunucu "cd /backup && cat backup_parca_*.part > prod_backup_restore.tar.gz"
Senaryo 3: Paralel Sıkıştırma
Büyük bir log dosyasını sıkıştırmanız gerekiyor ama tek çekirdek üzerinde saatler süruyor. split ile dosyayı bölerek paralel sıkıştırma yapabilirsiniz:
# Dosyayı CPU sayısı kadar parçaya böl
PARCA_SAYISI=$(nproc)
split -n l/$PARCA_SAYISI buyuk_log.txt /tmp/log_parca_
# Her parçayı arka planda paralel sıkıştır
for parca in /tmp/log_parca_*; do
gzip "$parca" &
done
# Tüm arka plan işlerinin bitmesini bekle
wait
echo "Paralel sikistirma tamamlandi"
ls -lh /tmp/log_parca_*.gz
Bu yaklaşım özellikle çok çekirdekli sistemlerde dramatik hız artışı sağlar. 8 çekirdekli bir sistemde bu işlem teorik olarak 8 kat daha hızlı tamamlanır.
Senaryo 4: Büyük CSV’yi İşleme
Veri mühendisliği veya analiz işlerinde sık karşılaşılan durum: 50 milyon satırlık bir CSV’yi işlemeniz gerekiyor ama script’iniz 10 milyon satır üzerinde bellek hatası veriyor:
# Header'ı kaydet
head -1 buyuk_veri.csv > header.csv
# Veriyi (header hariç) 5 milyon satırlık parçalara böl
tail -n +2 buyuk_veri.csv | split -l 5000000 - veri_parca_
# Her parçaya header ekle ve işle
for parca in veri_parca_*; do
cat header.csv "$parca" > gecici_parca.csv
python3 veri_isle.py gecici_parca.csv >> sonuclar.csv
echo "$parca islendi"
done
# Temizlik
rm veri_parca_* gecici_parca.csv
Burada tail -n +2 ile header satırını atlayıp veriyi pipe ile split‘e gönderdiğimize dikkat edin. Tire (-) stdin’den okumasını söylüyor.
–filter Seçeneği ile Gelişmiş Kullanım
--filter seçeneği split‘in en güçlü özelliklerinden biridir. Her parça oluşturulurken bir komuta pipe edilir ve bu çok yaratıcı kullanım senaryoları açar:
# Her parçayı oluştururken anında sıkıştır
split -b 500M --filter='gzip > $FILE.gz' buyuk_dosya.bin parca_
# Her parçayı oluştururken şifrele
split -b 1G --filter='gpg -c --batch --passphrase "gizli123" > $FILE.gpg' yedek.tar parca_
# Her parçayı oluştururken hem sıkıştır hem şifrele
split -b 2G --filter='gzip | gpg -c --batch --passphrase-file /root/.backup_pass > $FILE.gz.gpg' db_dump.sql segment_
$FILE değişkeni otomatik olarak çıktı dosyasının adını alır. Bu özellik disk alanını verimli kullanmanızı sağlar çünkü ara dosya oluşturmadan doğrudan işlem yapılır.
Parçalanmış Dosyaları Birleştirme
split ile bölünen dosyaları birleştirmek son derece basittir:
# Temel birleştirme
cat parca_* > orijinal_dosya.tar.gz
# Sıralama önemli, glob sıralı çalışır ama emin olmak için:
cat $(ls parca_* | sort) > orijinal_dosya.tar.gz
# Birleştirme sonrası bütünlük kontrolü (md5sum ile)
# Bölmeden önce:
md5sum orijinal_dosya.tar.gz > kontrol.md5
# Birleştirdikten sonra:
md5sum -c kontrol.md5
MD5 veya SHA256 ile bütünlük kontrolü yapmayı alışkanlık haline getirin. Özellikle ağ üzerinden transfer edilen parçalarda bit rot veya transfer hatası olabilir:
# Bölmeden önce checksum al
sha256sum buyuk_yedek.tar.gz > yedek.sha256
# Bölme işlemi
split -b 2G -d buyuk_yedek.tar.gz yedek_parca_
# Birleştirme
cat yedek_parca_* > buyuk_yedek_geri.tar.gz
# Kontrol
sha256sum -c yedek.sha256
# Çıktı: buyuk_yedek.tar.gz: OK
Sonek Uzunluğunu Yönetmek
Varsayılan 2 karakterlik sonek (aa, ab, …, zz) maksimum 676 parça destekler. Çok fazla parça oluşacaksa sonek uzunluğunu artırmanız gerekir:
# 3 karakterlik sonek ile 17576 adede kadar parça desteklenir
split -b 10M -a 3 cok_buyuk_arsiv.tar arsiv_parca_
# Oluşan dosyalar: arsiv_parca_aaa, arsiv_parca_aab, ...
# Sayısal sonek ve 4 haneli numaralandırma
split -b 50M -d -a 4 dev_log.tar.gz log_
# Oluşan dosyalar: log_0000, log_0001, log_0002, ...
Sayısal sonek kullanmak dosyaları sıralı tutma konusunda daha güvenilirdir çünkü ls komutu sayısal sıralamayı alfasayısaldan daha doğru yorumlar.
Pratik Script: Güvenli Yedek Bölücü
Gerçek hayatta kullandığım bir script paylaşayım. Bu script büyük yedekleri böler, checksum alır ve bir manifest dosyası oluşturur:
#!/bin/bash
# guvenli_bol.sh - Büyük dosyaları güvenli böler
DOSYA="$1"
BOYUT="${2:-1G}"
ONEK="${3:-parca_}"
if [ -z "$DOSYA" ]; then
echo "Kullanim: $0 <dosya> [boyut] [onek]"
echo "Ornek: $0 yedek.tar.gz 2G yedek_"
exit 1
fi
if [ ! -f "$DOSYA" ]; then
echo "Hata: $DOSYA bulunamadi"
exit 1
fi
echo "Dosya bolunuyor: $DOSYA"
echo "Parca boyutu: $BOYUT"
# Orijinal dosyanin checksumunu al
echo "Checksum hesaplaniyor..."
sha256sum "$DOSYA" > "${DOSYA}.sha256"
# Dosyayi bol
split -b "$BOYUT" -d --verbose "$DOSYA" "$ONEK"
# Her parcanin checksumunu al ve manifest olustur
echo "Manifest olusturuluyor..."
echo "# Orijinal dosya: $DOSYA" > manifest.txt
echo "# Bolunme tarihi: $(date)" >> manifest.txt
echo "# Parca boyutu: $BOYUT" >> manifest.txt
echo "" >> manifest.txt
for parca in ${ONEK}*; do
sha256sum "$parca" >> manifest.txt
done
echo ""
echo "Tamamlandi! Olusturulan parcalar:"
ls -lh ${ONEK}*
echo ""
echo "Birlestirime komutu:"
echo "cat ${ONEK}* > $DOSYA && sha256sum -c ${DOSYA}.sha256"
Bu scripti şöyle kullanırsınız:
chmod +x guvenli_bol.sh
./guvenli_bol.sh /backup/prod_db.tar.gz 2G db_parca_
Sık Yapılan Hatalar
Glob sıralamasına dikkat edin. cat parca_ yerine cat $(ls -v parca_) kullanmak bazı durumlarda daha güvenlidir, özellikle farklı uzunlukta sonek karışımı varsa.
Disk alanını kontrol etmeyi unutmayın. Bölme işlemi orijinal dosyayı silmez, yani geçici olarak iki katı disk alanı harcarsınız. df -h ile kontrol edin.
Header içeren dosyalarda dikkatli olun. CSV veya diğer başlık satırı olan dosyaları bölerken her parçanın header içermesini isteyip istemediğinizi düşünün.
Küçük parça boyutlarından kaçının. Çok küçük parçalar (10MB altı) overhead yaratır ve binlerce dosya oluşturabilir. Genellikle 500MB-2GB arası pratik bir aralıktır.
split ile tar Kombinasyonu
Sıkıştırma ve bölme işlemini tek adımda yapmak için split ve tar‘ı pipe ile birleştirebilirsiniz:
# Dizini tar ile arşivleyip split ile böl (tek komut)
tar czf - /var/www/html | split -b 1G - web_yedek_
# Geri yüklemek için
cat web_yedek_* | tar xzf - -C /var/www/html
# Uzak sunucuya direkt gönder
tar czf - /home | split -b 2G --filter='ssh kullanici@backup-server "cat > /backup/$FILE"' - home_yedek_
Bu yaklaşım disk alanından tasarruf sağlar çünkü geçici arşiv dosyası oluşturulmuyor.
Sonuç
split komutu, sysadmin araç setinin vazgeçilmez bir parçasıdır. FAT32 kısıtlamalarını aşmaktan paralel işleme optimizasyonuna, ağ transferi güvenilirliğinden bellek kısıtlı ortamlarda büyük veri işlemeye kadar onlarca senaryoda hayat kurtarır.
Komutun gücü sadece dosya bölmekten değil, pipe ve filtre mekanizmaları sayesinde diğer araçlarla entegrasyonundan gelir. tar, gzip, gpg, rsync ve ssh ile kombinasyonları gerçekten etkileyici iş akışları oluşturmanızı sağlar.
Şunu aklınızda tutun: büyük dosyaları parçalamadan önce her zaman checksum alın ve birleştirme sonrası mutlaka doğrulama yapın. Veri bütünlüğü disk alanı veya transfer hızından çok daha değerlidir.