Linux dünyasında dosya arşivleme işlemleri günlük sistem yönetiminin ayrılmaz bir parçası. Sunucu yedeklemeleri, log dosyalarını sıkıştırma, yazılım dağıtımı veya sadece bir dizini başka bir sunucuya taşıma… Hepsinde tar komutu karşımıza çıkıyor. Yıllarca bu komutu kullanan biri olarak söyleyeyim: tar basit görünse de içinde barındırdığı seçeneklerle gerçekten güçlü bir araç. Bu yazıda tar komutunu A’dan Z’ye ele alacağız, gerçek dünya senaryolarıyla pekiştireceğiz.
tar Nedir ve Neden Hala Kullanıyoruz?
tar kelimesi Tape ARchive’ın kısaltması. Adından da anlaşılacağı gibi, başlangıçta manyetik bant sürücüleri için geliştirilmiş bir araç. Ama bugün hala aktif olarak kullanılmasının nedeni son derece basit: işe yarıyor ve her Linux dağıtımında standart olarak geliyor.
tar tek başına sıkıştırma yapmaz, dosyaları tek bir arşiv dosyasına toplar. Sıkıştırma işini gzip, bzip2, xz gibi araçlarla birlikte yapar. Bu ayrım önemli çünkü bazen sıkıştırmadan sadece arşivleme yapmak isteyebilirsiniz, özellikle zaten sıkıştırılmış dosyalarla çalışırken.
Temel Parametreler
tar komutunun parametrelerini ezberlemek yerine mantığını anlamak çok daha işe yarıyor. Ama yine de sık kullanılanları bilmek gerekiyor:
- -c: Yeni arşiv oluştur (create)
- -x: Arşivi aç (extract)
- -t: Arşiv içeriğini listele (list)
- -v: Ayrıntılı çıktı göster (verbose)
- -f: Dosya adı belirt (file) – neredeyse her zaman kullanılır
- -z: gzip sıkıştırması kullan (.tar.gz veya .tgz)
- -j: bzip2 sıkıştırması kullan (.tar.bz2)
- -J: xz sıkıştırması kullan (.tar.xz)
- -p: İzinleri koru (preserve permissions)
- -P: Mutlak yol kullan (dikkatli kullanılmalı)
- –exclude: Belirli dosya veya dizinleri dışla
- -C: Hedef dizin belirt (extract için)
- –strip-components: Açarken üst dizinleri çıkar
- -r: Mevcut arşive dosya ekle
- –newer: Belirli bir tarihten yeni dosyaları arşivle
Modern tar sürümlerinde tire (-) kullanmadan da parametreleri yazabilirsiniz, ama alışkanlık olarak tire kullanmak daha okunaklı.
Arşiv Oluşturma
Basit tar Arşivi
En temel kullanım senaryosundan başlayalım. Elimde /var/www/html dizini var ve bunu arşivlemek istiyorum:
tar -cvf web_yedek.tar /var/www/html
Burada -c oluştur, -v verbose (ne yapıldığını göster), -f dosya adı belirt anlamına geliyor. Bu komut sıkıştırma yapmadan sadece arşiv oluşturur.
gzip ile Sıkıştırılmış Arşiv
Gerçek hayatta en çok kullandığım format .tar.gz. Hız ve sıkıştırma oranı arasında iyi bir denge sunuyor:
tar -czvf web_yedek.tar.gz /var/www/html
Sıkıştırma oranını görmek isterseniz komut bittikten sonra:
ls -lh web_yedek.tar.gz
bzip2 ile Daha Yüksek Sıkıştırma
Daha iyi sıkıştırma oranı istiyorsanız ama süre önemliyse bzip2 kullanın. gzip’ten yaklaşık %10-15 daha iyi sıkıştırır ama daha yavaştır:
tar -cjvf web_yedek.tar.bz2 /var/www/html
xz ile Maksimum Sıkıştırma
Disk alanı kritikse ve zaman önemli değilse xz formatı en yüksek sıkıştırma oranını sunar. Özellikle yazılım kaynak kodlarını dağıtırken yaygın kullanılır:
tar -cJvf web_yedek.tar.xz /var/www/html
Birden Fazla Dizin veya Dosyayı Arşivleme
tar -czvf yedek.tar.gz /var/www/html /etc/nginx /etc/ssl/certs
Bu kadar basit. Birden fazla kaynak belirtmek için sadece boşlukla ayırıyorsunuz.
Arşiv Açma
Temel Açma İşlemi
tar -xzvf web_yedek.tar.gz
Bu komut arşivi mevcut dizine açar. Dikkat: arşiv içindeki yol yapısına göre alt dizinler oluşturulur.
Belirli Bir Dizine Açma
Çoğu zaman arşivi mevcut dizine değil başka bir yere açmak istersiniz:
tar -xzvf web_yedek.tar.gz -C /opt/restore/
-C parametresi hedef dizini belirtiyor. Dizin önceden mevcut olmalı, tar sizin için oluşturmuyor.
Arşivden Sadece Belirli Dosyaları Çıkarma
Bazen 5 GB’lık bir arşivden sadece tek bir config dosyasına ihtiyacınız olur. Tüm arşivi açmak yerine:
tar -xzvf web_yedek.tar.gz var/www/html/wp-config.php
Not: Yolu arşiv içindeki yapıya göre vermeniz gerekiyor. Başında / olmadan.
Arşiv İçeriğini İnceleme
Dosyaları Listeleme
Açmadan önce içeriğe bakmak iyi bir alışkanlık:
tar -tzvf web_yedek.tar.gz
Belirli Dosyaları Filtreleyerek Listeleme
Arşiv büyükse grep ile filtreleyebilirsiniz:
tar -tzvf web_yedek.tar.gz | grep ".conf$"
Gerçek Dünya Senaryoları
Senaryo 1: Günlük Otomatik Yedekleme Scripti
Üretim sunucularında çalışan bir script örneği. Bu script /etc, /var/www ve veritabanı dump’larını her gece yedekliyor:
#!/bin/bash
TARIH=$(date +%Y%m%d_%H%M%S)
YEDEK_DIZIN="/backup/gunluk"
LOG="/var/log/yedek.log"
mkdir -p "$YEDEK_DIZIN"
echo "[$TARIH] Yedekleme basliyor..." >> "$LOG"
# Web dosyaları
tar -czvf "$YEDEK_DIZIN/web_$TARIH.tar.gz"
--exclude='/var/www/html/cache'
--exclude='/var/www/html/tmp'
/var/www/html >> "$LOG" 2>&1
# Konfigürasyon dosyaları
tar -czvf "$YEDEK_DIZIN/etc_$TARIH.tar.gz"
/etc/nginx
/etc/mysql
/etc/php
/etc/ssl >> "$LOG" 2>&1
# 30 günden eski yedekleri sil
find "$YEDEK_DIZIN" -name "*.tar.gz" -mtime +30 -delete
echo "[$TARIH] Yedekleme tamamlandi." >> "$LOG"
Bu scripti crontab’a ekleyerek her gece çalıştırabilirsiniz:
0 2 * * * /usr/local/bin/gece_yedek.sh
Senaryo 2: Exclude Kullanımı
Büyük projelerde node_modules, .git gibi dizinleri yedeklemek hem zaman hem yer kaybı. Bunları dışlamak için:
tar -czvf proje_yedek.tar.gz
--exclude='./node_modules'
--exclude='./.git'
--exclude='./dist'
--exclude='*.log'
./my-project/
Birden fazla exclude pattern kullanabilirsiniz. Dikkat: --exclude parametresi dosya adından önce gelmelii.
Senaryo 3: Incremental Yedekleme (Artımlı Yedek)
Büyük sistemlerde her gün tam yedek almak pratik değil. tar ile basit bir incremental yedek yapısı kurabilirsiniz:
# Snapshot dosyası ile incremental yedek
# İlk tam yedek
tar -czvf tam_yedek_$(date +%Y%m%d).tar.gz
--listed-incremental=/var/backup/snapshot.file
/var/www/html
# Sonraki günlerde artımlı yedek (aynı snapshot dosyasını kullanır)
tar -czvf artimli_yedek_$(date +%Y%m%d).tar.gz
--listed-incremental=/var/backup/snapshot.file
/var/www/html
Artımlı yedekten geri dönmek için önce tam yedek, sonra sırayla artımlı yedekler açılmalı.
Senaryo 4: Sunucular Arası Veri Transferi
tar ve ssh‘ı birleştirerek disk yazmadan direkt transfer yapabilirsiniz. Bu özellikle büyük miktarda küçük dosya transferinde son derece etkili:
# Yerel dizini uzak sunucuya gönder
tar -cz /var/www/html | ssh kullanici@uzak-sunucu "tar -xz -C /var/www/"
# Uzak sunucudan yerel makineye çek
ssh kullanici@uzak-sunucu "tar -cz /var/www/html" | tar -xz -C /tmp/restore/
Bu yöntem geçici dosya oluşturmadan pipe üzerinden transfer yaptığı için hem hızlı hem de temiz.
Senaryo 5: İzinleri Koruyarak Arşivleme
Web sunucusu dosyaları veya özel izinlere sahip dizinleri yedeklerken izinlerin korunması kritik:
# Root olarak çalıştırın
tar -czvpf sistem_yedek.tar.gz /etc /var/www
# Açarken de izinleri koru
tar -xzvpf sistem_yedek.tar.gz -C /restore/
-p parametresi olmadan açılan dosyalarda izinler mevcut kullanıcıya göre ayarlanır, bu çoğu durumda istemediğiniz bir sonuç.
İleri Seviye Kullanım
Çok Parçalı Arşiv Oluşturma
5 GB sınırlı bir depolama alanınız varsa ve 15 GB’lık bir arşiv oluşturmanız gerekiyorsa split komutuyla birleştirebilirsiniz:
# 4 GB'lık parçalara böl
tar -czvf - /buyuk/dizin | split -b 4G - yedek_parca_
# Parçaları birleştirip açmak için
cat yedek_parca_* | tar -xzvf -
Arşiv Bütünlüğünü Doğrulama
Önemli yedeklerinizi oluşturduktan sonra doğrulama yapmak iyi bir alışkanlık:
# Arşivi test et (açmadan)
tar -tzvf yedek.tar.gz > /dev/null && echo "Arsiv gecerli" || echo "HATA: Arsiv bozuk"
# Daha detaylı test
tar --test-label -f yedek.tar.gz
Arşive Sonradan Dosya Ekleme
Sıkıştırılmamış .tar arşivlerine sonradan dosya ekleyebilirsiniz. Not: Bu özellik .tar.gz gibi sıkıştırılmış formatlarda çalışmaz.
# Mevcut tar arşivine dosya ekle
tar -rvf arsiv.tar yeni_dosya.conf
# Dizin ekle
tar -rvf arsiv.tar /yeni/dizin/
Belirli Bir Tarihten Yeni Dosyaları Arşivleme
Log analizi veya değişiklik takibi yaparken son derece kullanışlı:
# Son 7 günde değişen dosyaları arşivle
tar -czvf degisen_dosyalar.tar.gz
--newer=$(date -d "7 days ago" +%Y-%m-%d)
/var/log/nginx/
Sembolik Linkleri Takip Etme
Varsayılan olarak tar sembolik linkleri link olarak arşivler, linkin işaret ettiği dosyayı değil. Gerçek dosyayı dahil etmek için:
tar -czvhf arsiv.tar.gz /dizin/
-h parametresi sembolik linkleri takip eder ve gerçek dosyayı arşive ekler.
Sıkıştırma Formatlarını Karşılaştırma
Hangi formatı seçeceğiniz kullanım senaryonuza göre değişiyor:
- tar (sıkıştırmasız): Zaten sıkıştırılmış dosyalar (JPEG, MP4, ZIP) için. CPU kullanımı yok, hız maksimum.
- tar.gz: Günlük kullanım için en dengeli seçenek. Geniş uyumluluk, iyi hız, iyi sıkıştırma.
- tar.bz2: Arşiv boyutu kritikse tercih edin. gzip’ten yavaş ama daha iyi sıkıştırma.
- tar.xz: Yazılım dağıtımı için ideal. En iyi sıkıştırma oranı ama en yavaş.
- tar.zst: Zstandard formatı, modern sistemlerde giderek yaygınlaşıyor. Hız ve sıkıştırma oranı açısından gzip ve bzip2 arasında mükemmel bir denge sunuyor.
zstd formatı kullanmak için:
tar -czvf arsiv.tar.zst --use-compress-program=zstd /dizin/
# veya modern tar sürümlerinde
tar --zstd -cvf arsiv.tar.zst /dizin/
Sık Yapılan Hatalar ve Çözümleri
“Removing leading / from member names” uyarısı: Bu bir hata değil, güvenlik özelliği. tar mutlak yolları göreceli yola çeviriyor. Bunu istemiyorsanız -P parametresi kullanın ama dikkatli olun, açarken dosyalar orijinal konumlara yazılır.
Arşiv açıldığında beklenen dizin yapısı gelmiyor: --strip-components ile üst dizinleri çıkarabilirsiniz:
# Arşivde var/www/html/dosya.php varsa, sadece dosya.php'yi almak için
tar -xzvf arsiv.tar.gz --strip-components=3 -C /hedef/
İzin hatası alıyorsunuz: Sistem dosyalarını arşivlerken root olarak çalıştırmanız gerekiyor. sudo tar -czvf kullanın.
Arşiv çok büyük: Önce ne kadar yer kaplayan neyin arşive girdiğine bakın:
tar -tzvf buyuk_arsiv.tar.gz | sort -k3 -rn | head -20
Pratik Takma Adlar (Alias)
.bashrc veya .zshrc dosyanıza ekleyebileceğiniz kullanışlı alias’lar:
# Arşiv oluştur
alias tarc='tar -czvf'
# Arşiv aç
alias tarx='tar -xzvf'
# Arşiv listele
alias tarl='tar -tzvf'
# Kullanım:
# tarc yedek.tar.gz /dizin/
# tarx yedek.tar.gz
# tarl yedek.tar.gz
Sonuç
tar komutu onlarca yıldır Linux ekosisteminin temel taşlarından biri ve bu kadar uzun süre ayakta kalmasının nedeni basit ama güçlü bir araç olması. Temel kullanımı beş dakikada öğrenebilirsiniz ama --listed-incremental, --newer, pipe üzerinden transfer gibi ileri özellikler sizi gerçek anlamda verimli bir sysadmin yapıyor.
Benim öneri sıram şu: Önce -czvf ve -xzvf kombinasyonlarını ezberleyin. Sonra --exclude kullanmayı alışkanlık haline getirin, gereksiz dosyaları arşive sokmamak hem zaman hem alan kazandırır. Sonrasında pipe ile SSH transferini deneyin, büyük veri taşıma işlerinde hayat kurtarıyor. Son olarak da yedeklerinizi düzenli olarak test edin. Açılmayan bir yedek, hiç olmayan yedekten farksız.
Herhangi bir konuda soru veya eklemek istediğiniz senaryo varsa yorumlarda belirtin, yazıyı güncelleyebiliriz.