Arşivleme İşlemlerinde Çapraz Platform Uyumluluğu: Windows, macOS ve Linux Arasında Sorunsuz Arşiv Transferi
Yıllar içinde fark ettim ki, arşivleme konusunda en fazla çile çeken ekipler aynı zamanda en fazla platform çeşitliliğiyle çalışan ekipler. Birinin macOS’u, diğerinin Windows’u, CI/CD pipeline’ının Linux sunucusu var ve herkes “neden bu arşiv açılmıyor?” diye soruyor. Bu yazıda o soruyu kalıcı olarak çözmeye çalışacağız.
Sorunun Kökü: Neden Platformlar Arası Arşiv Sorunları Yaşıyoruz?
Her işletim sistemi dosya sistemini farklı yorumlar. Bu yorum farkları, arşiv dosyalarına da yansır. En temel sorunlar şunlar:
- Satır sonu karakterleri: Windows CRLF (
rn) kullanırken Linux ve macOS sadece LF (n) kullanır - Dosya izinleri: Linux ve macOS izin bitleri saklarken Windows bunları görmezden gelir
- Sembolik bağlantılar: Windows’ta sembolik bağlantılar farklı davranır, tar arşivleri bu konuda sıkıntı çıkarır
- Karakter kodlaması: Türkçe karakterler içeren dosya isimleri farklı sistemlerde farklı kodlanır (UTF-8 vs Windows-1252)
- Büyük/küçük harf duyarlılığı: macOS varsayılan olarak büyük/küçük harfe duyarsız, Linux duyarlı, Windows duyarsız
- Gizli dosyalar: macOS’un yarattığı
._önekli resource fork dosyaları ve.DS_Storedosyaları
Bu sorunların hepsine tek bir formül yoktur. Senaryoya göre farklı yaklaşımlar gerekir.
ZIP: Ortak Payda Ama Dikkatli Kullanılmalı
ZIP formatı, platformlar arası uyumluluk söz konusu olduğunda ilk akla gelen format. Hem Windows Explorer hem macOS Finder hem de Linux’un hemen her dağıtımı ZIP’i natively destekler. Ama ZIP de kusursuz değil.
Linux tarafında ZIP oluştururken dikkat etmeniz gereken birkaç şey var:
# Temel ZIP oluşturma - macOS ve Windows'ta açılabilir
zip -r arsiv.zip /proje/dizini/
# Gizli dosyaları dahil et ama macOS resource fork'larını hariç tut
zip -r arsiv.zip /proje/dizini/ -x "*/._*" -x "*/.DS_Store" -x "*/__MACOSX/*"
# Dosya izinlerini koru (Linux-to-Linux transferlerde faydalı)
zip -r --symlinks arsiv.zip /proje/dizini/
# Sıkıştırma seviyesini belirle (0-9, 9 en yüksek sıkıştırma)
zip -9 -r arsiv.zip /proje/dizini/
macOS’tan zip oluştururken şunu kesinlikle öneririm: Her macOS zip arşivinin içinde __MACOSX adında bir klasör ve ._ önekli dosyalar oluşur. Bunlar resource fork kalıntılarıdır ve Linux tarafında hiçbir işe yaramazlar. Eğer macOS kullanan bir ekip üyesi arşiv oluşturuyorsa, Linux’ta açarken bu dosyaları temizlemek gerekebilir.
# macOS'tan gelen kirli ZIP'i Linux'ta temizleyerek aç
unzip arsiv.zip -d /hedef/dizin/
find /hedef/dizin/ -name "._*" -delete
find /hedef/dizin/ -name ".DS_Store" -delete
rm -rf /hedef/dizin/__MACOSX/
# Ya da açarken doğrudan filtrele
unzip arsiv.zip -x "*.DS_Store" -x "__MACOSX/*" -x "*/._*" -d /hedef/dizin/
Karakter Kodlaması: Türkçe Dosya İsimlerinin Çilesi
Türkçe karakterler içeren dosya isimleri, platformlar arası transferde en sık karşılaşılan problemlerden biri. Windows’ta oluşturulan bir ZIP arşivi içindeki “müşteri_listesi.xlsx” dosyası, Linux’ta “m??teri_listesi.xlsx” olarak görünebilir.
# Windows'tan gelen ZIP'teki Türkçe karakter sorununu çöz
# Windows genellikle CP850 veya CP437 kullanır
unzip -O CP850 windows_arsivi.zip -d /hedef/
# Ya da iconv ile dönüştür
unzip -p windows_arsivi.zip | iconv -f CP1252 -t UTF-8 > cikti_dosyasi
# Mevcut arşivdeki dosya isimlerini önce kontrol et
unzip -l windows_arsivi.zip | head -20
# zipinfo ile detaylı bilgi al
zipinfo windows_arsivi.zip
Eğer Python kuruluysa (ki genellikle kurulu olur), daha güvenilir bir yaklaşım şu olabilir:
# Python ile ZIP içeriğini UTF-8 olarak yeniden oluştur
python3 << 'EOF'
import zipfile
import os
kaynak_zip = "windows_arsivi.zip"
hedef_zip = "utf8_arsiv.zip"
with zipfile.ZipFile(kaynak_zip, 'r') as kaynak:
with zipfile.ZipFile(hedef_zip, 'w', compression=zipfile.ZIP_DEFLATED) as hedef:
for item in kaynak.infolist():
try:
# Windows CP437 ile kodlanmış isimleri UTF-8'e çevir
yeni_isim = item.filename.encode('cp437').decode('utf-8')
except (UnicodeDecodeError, UnicodeEncodeError):
yeni_isim = item.filename
veri = kaynak.read(item.filename)
hedef.writestr(yeni_isim, veri)
print(f"Dönüştürüldü: {item.filename} -> {yeni_isim}")
print("Tamamlandı.")
EOF
TAR: Linux Ekosisteminin Güçlü Silahı
TAR, Linux ortamında tartışmasız en kapsamlı arşiv aracıdır. Dosya izinleri, sembolik bağlantılar, sahiplik bilgileri, zaman damgaları hepsini saklayabilir. Ama Windows’a transfer söz konusu olduğunda bazı hazırlıklar gerekir.
Modern Windows 10 ve Windows 11, tar komutunu Command Prompt üzerinden destekler. Ama tam uyumluluk için yine de dikkatli olmak gerekir.
# Standart TAR.GZ oluşturma
tar -czf arsiv.tar.gz /proje/dizini/
# Verbose modda oluştur, ne paketlendiğini gör
tar -czvf arsiv.tar.gz /proje/dizini/
# Windows'a gönderilecek TAR arşivi için sahiplik bilgilerini sıfırla
# (Windows bu bilgileri zaten kullanmaz, ama uyumluluk için temiz tutalım)
tar -czf arsiv.tar.gz --owner=0 --group=0 /proje/dizini/
# Sembolik bağlantıları takip ederek arşivle (Windows için daha güvenli)
tar -czhvf arsiv.tar.gz /proje/dizini/
# Belirli dosyaları hariç tut
tar -czf arsiv.tar.gz
--exclude="*.log"
--exclude=".git"
--exclude="node_modules"
--exclude="*.tmp"
/proje/dizini/
Windows’ta WSL (Windows Subsystem for Linux) kullanıyorsanız, tar komutları doğrudan çalışır. Ama Windows kullanıcıları 7-Zip veya WinRAR kullanıyorsa, onlar da tar.gz dosyalarını açabilir. Bu yüzden tar.gz formatı aslında düşündüğünüzden daha geniş bir kitleye hitap eder.
GZIP, BZIP2, XZ: Hangi Sıkıştırma Algoritmasını Seçmeli?
Sadece arşivleme değil, sıkıştırma algoritması seçimi de önemli. Platformlar arası uyumluluk açısından değerlendirirsek:
- gzip (.gz): En yaygın, her yerde destekleniyor, hız/sıkıştırma dengesi iyi
- bzip2 (.bz2): Daha iyi sıkıştırma, daha yavaş, yine de yaygın destek
- xz (.xz): En iyi sıkıştırma, en yavaş, ama büyük dosyalarda ciddi fark yaratıyor
- zstd (.zst): Modern sistemlerde giderek yaygınlaşıyor, hız ve sıkıştırma dengesi mükemmel
# Farklı sıkıştırma yöntemleriyle arşiv oluşturma
# GZIP - En uyumlu
tar -czf arsiv.tar.gz dizin/
# BZIP2 - Daha iyi sıkıştırma
tar -cjf arsiv.tar.bz2 dizin/
# XZ - En iyi sıkıştırma (büyük dosyalar için)
tar -cJf arsiv.tar.xz dizin/
# ZSTD - Modern sistemlerde hızlı seçenek
tar --zstd -cf arsiv.tar.zst dizin/
# Paralel sıkıştırma ile hızlandır (pigz gerekir)
tar -cf - dizin/ | pigz -9 > arsiv.tar.gz
# Sıkıştırma oranlarını karşılaştır (karar vermek için)
for fmt in gz bz2 xz; do
tar -cf - dizin/ | gzip -c > /dev/null
echo "Format: $fmt"
done
Pratikte, Windows kullanıcılarına göndereceğiniz arşivler için ZIP tercih edin. Linux sunucular arası ya da DevOps pipeline’larında tar.gz ya da tar.xz daha mantıklı.
Gerçek Dünya Senaryosu: Geliştirici Ortamı Senkronizasyonu
Diyelim ki bir web geliştirme ekibiniz var. Windows’ta çalışan backend geliştiriciler, macOS kullanan frontend geliştiriciler ve production Linux sunucuları. Kaynak kodunu arşivleyip aktarmak gerekiyor.
#!/bin/bash
# cross_platform_arsiv.sh
# Proje arşivini tüm platformlar için hazırlar
PROJE_DIZIN="${1:-.}"
PROJE_ADI=$(basename "$(realpath "$PROJE_DIZIN")")
TARIH=$(date +%Y%m%d_%H%M%S)
CIKTI_DIZIN="/tmp/arsivler"
mkdir -p "$CIKTI_DIZIN"
echo "Proje: $PROJE_ADI arşivleniyor..."
# Windows kullanıcıları için ZIP oluştur
echo "[1/3] Windows uyumlu ZIP oluşturuluyor..."
zip -9 -r "$CIKTI_DIZIN/${PROJE_ADI}_${TARIH}_windows.zip" "$PROJE_DIZIN"
-x "*.DS_Store"
-x "__MACOSX/*"
-x "*/._*"
-x "*/.git/*"
-x "*/node_modules/*"
-x "*/vendor/*"
-x "*.log"
# Linux/macOS sunucular için TAR.GZ oluştur
echo "[2/3] Linux/macOS uyumlu TAR.GZ oluşturuluyor..."
tar -czf "$CIKTI_DIZIN/${PROJE_ADI}_${TARIH}_linux.tar.gz"
--exclude=".git"
--exclude="node_modules"
--exclude="vendor"
--exclude="*.log"
--exclude=".DS_Store"
"$PROJE_DIZIN"
# Checksum oluştur (doğrulama için)
echo "[3/3] Checksum dosyaları oluşturuluyor..."
cd "$CIKTI_DIZIN"
sha256sum "${PROJE_ADI}_${TARIH}_windows.zip" > "${PROJE_ADI}_${TARIH}.sha256"
sha256sum "${PROJE_ADI}_${TARIH}_linux.tar.gz" >> "${PROJE_ADI}_${TARIH}.sha256"
echo "Tamamlandı. Arşivler: $CIKTI_DIZIN"
ls -lh "$CIKTI_DIZIN"
Bu script’i projenizde bir Makefile hedefi olarak da tanımlayabilirsiniz, ya da CI/CD pipeline’ınıza entegre edebilirsiniz.
Büyük Arşivlerin Bölünmesi ve Birleştirilmesi
Transfer sırasında boyut kısıtlamaları olduğunda arşivi bölmek gerekebilir. Bu da platformlar arası uyumluluğu ilgilendiren bir konu.
# Arşivi 500MB'lık parçalara böl
split -b 500M arsiv.tar.gz "arsiv_parca_"
# Sonuç: arsiv_parca_aa, arsiv_parca_ab, arsiv_parca_ac ...
# Parçaları birleştir
cat arsiv_parca_* > arsiv_yeniden.tar.gz
# Doğrulama
md5sum arsiv.tar.gz arsiv_yeniden.tar.gz
# ZIP için bölünmüş arşiv oluştur (her platformda açılabilir)
zip -s 500m -r buyuk_proje.zip /proje/dizini/
# Sonuç: buyuk_proje.zip, buyuk_proje.z01, buyuk_proje.z02 ...
# Bölünmüş ZIP'i birleştir ve aç
zip -FF buyuk_proje.zip --out tam_arsiv.zip
unzip tam_arsiv.zip
Arşiv Bütünlüğünü Doğrulama
Transfer sonrası arşivin bozulmadığını doğrulamak kritik önem taşır. Özellikle cross-platform senaryolarda, binary veri bozulması nadir de olsa karşılaşılan bir durum.
# TAR arşivini doğrula (açmadan test et)
tar -tzf arsiv.tar.gz > /dev/null && echo "TAR arşivi sağlam" || echo "HATA: Arşiv bozuk"
# ZIP arşivini doğrula
unzip -t arsiv.zip && echo "ZIP arşivi sağlam" || echo "HATA: Arşiv bozuk"
# Checksum ile doğrulama
sha256sum arsiv.tar.gz > arsiv.sha256
# Transfer sonrası
sha256sum -c arsiv.sha256
# MD5 (eski sistemlerle uyumluluk için hala kullanılıyor)
md5sum arsiv.tar.gz > arsiv.md5
md5sum -c arsiv.md5
# Daha kapsamlı TAR doğrulama
tar -czvf - /proje/dizini/ | tee arsiv.tar.gz | sha256sum > arsiv.sha256
Windows WSL ile TAR Kullanımı: Pratik Notlar
Windows 10/11’de WSL kullanan ekip üyeleriniz varsa, onlar için de bir not düşmek istiyorum. WSL içinden Windows dosya sistemine erişirken (/mnt/c/, /mnt/d/ gibi) arşiv oluştururken bazı sınırlamalar var.
Windows NTFS bölümündeki dosyaları WSL’den tar ile arşivlerken sembolik bağlantılar ve bazı izin bitleri doğru kaydedilemez. Bu durumda şu yaklaşım daha güvenli:
# WSL içinden Windows dosyalarını arşivlerken
# --no-xattrs ile extended attributes'ları hariç tut
tar -czf /mnt/c/Users/kullanici/arsiv.tar.gz
--no-xattrs
--no-acls
--no-selinux
/mnt/c/Users/kullanici/Proje/
# Ya da doğrudan ZIP kullan (WSL'den Windows'a en uyumlu format)
zip -r /mnt/c/Users/kullanici/arsiv.zip /mnt/c/Users/kullanici/Proje/
-x "*.lnk" # Windows kısayollarını hariç tut
Otomasyon: cron ve Arşivleme Pipeline’ları
Gerçek hayatta arşivleme genellikle otomatik yapılır. Hem Linux cron hem de Windows Task Scheduler ile çalışacak şekilde dizayn edilmiş bir arşiv stratejisi şöyle görünebilir:
#!/bin/bash
# /usr/local/bin/gunluk_arsiv.sh
# Crontab: 0 2 * * * /usr/local/bin/gunluk_arsiv.sh
LOG_DOSYA="/var/log/arsivleme.log"
ARSIV_DIZIN="/backup/arsivler"
KAYNAK_DIZIN="/var/www/html"
GUNLER_SAKLA=30 # Kaç gün saklanacak
tarih=$(date +%Y%m%d)
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_DOSYA"
}
log "Arşivleme başlıyor..."
# Arşiv oluştur
if tar -czf "$ARSIV_DIZIN/web_backup_${tarih}.tar.gz"
--exclude="*.log"
--exclude="*.tmp"
--exclude=".git"
"$KAYNAK_DIZIN" 2>> "$LOG_DOSYA"; then
log "Arşiv başarıyla oluşturuldu: web_backup_${tarih}.tar.gz"
# Checksum kaydet
sha256sum "$ARSIV_DIZIN/web_backup_${tarih}.tar.gz" >> "$ARSIV_DIZIN/checksums.txt"
# Eski arşivleri temizle
find "$ARSIV_DIZIN" -name "web_backup_*.tar.gz" -mtime +$GUNLER_SAKLA -delete
log "30 günden eski arşivler temizlendi"
else
log "HATA: Arşivleme başarısız!"
exit 1
fi
log "Arşivleme tamamlandı."
Sıkça Karşılaşılan Hatalar ve Çözümleri
Deneyimlerime dayanarak en sık karşılaşılan hataları ve çözümlerini şöyle sıralayabilirim:
“Cannot open: No such file or directory” hatası: Bu genellikle arşiv içindeki dosya yollarında boşluk veya özel karakter olduğunda çıkar. Çözüm:
# Boşluk içeren dosya isimlerini doğru işle
tar -czf arsiv.tar.gz -- "dosya adı ile boşluk/"
# Null-terminated listeden arşivle
find /proje -print0 | tar -czf arsiv.tar.gz --null -T -
“Unexpected EOF” hatası: Transfer sırasında veri bozulması olmuştur. Checksum doğrulaması yapın ve tekrar transfer edin.
ZIP açılırken “bad CRC” hatası: Dosya transfer sırasında binary veri ASCII mod olarak transfer edilmiş olabilir. FTP kullanıyorsanız binary moda geçin.
Permission denied hatası macOS’ta ZIP açarken: macOS’ta ZIP içindeki çalıştırılabilir dosyalar bazen Gatekeeper tarafından engellenir.
# macOS'ta ZIP içindeki çalıştırılabilir bitleri koru
ditto -c -k --keepParent kaynak/ arsiv.zip
# Açarken
ditto -x -k arsiv.zip hedef/
Sonuç
Platformlar arası arşiv uyumluluğu, “bir kez yapıp unut” değil sürekli dikkat gerektiren bir konu. Ekip yapınıza göre net bir standart belirlemek, uzun vadede en büyük tasarrufu sağlar.
Pratik tavsiyem şu: Windows kullanıcıları dahilse ZIP, sadece Unix sistemler arasında transferse tar.gz veya tar.xz kullanın. Türkçe karakter içeren dosya isimlerine her zaman şüpheyle yaklaşın ve arşiv oluştururken UTF-8 kodlamasını açıkça belirtin. Transfer sonrası checksum doğrulamasını alışkanlık haline getirin, özellikle kritik veri aktarımlarında bu adımı atlamayın.
Otomasyon yazarken arşiv script’lerinizi tek bir Linux dağıtımında değil, hedef platformların hepsinde test edin. Bir arşivin oluşturulması kadar düzgün açılması da önemli. En sık sorun da zaten hedef platformda fark ediliyor.
Bu yazıda bahsedilen senaryoların büyük çoğunluğu gerçek projelerden derlendi. Her ortam biraz farklı davranır, ama temel prensipler evrensel. Sorularınız veya eklemek istediğiniz senaryolar varsa yorumlarda buluşalım.
