00 Arşiv vs sıkıştırma
İki farklı işlem, genellikle birlikte kullanılır ama birbirinden ayrıdır.
Arşivleme: Birden fazla dosyayı tek dosyaya birleştirir dizin yapısını, izinleri, timestamp'leri korur Araç: tar → .tar dosyası Sıkıştırma: Tek dosyayı küçülttür Araç: gzip → .gz xz → .xz zstd → .zst bzip2 → .bz2 Genellikle birlikte: tar → .tar tar + gzip → .tar.gz veya .tgz tar + xz → .tar.xz tar + zstd → .tar.zst
tar arşivleri sıkıştırmadan da kullanılır — özellikle streaming backup veya NFS üzerinde.
zip: her dosyayı ayrı ayrı sıkıştırır → rastgele erişim mümkün, sıkıştırma oranı düşük. tar.gz: önce birleştirir, sonra tek blok olarak sıkıştırır → daha iyi oran, ama tek dosya çıkartmak için tümünü çözmen gerekebilir. Windows ile paylaşmak için zip, Linux/macOS'ta tar.gz tercih edilir.
01 tar temel üçlü
Oluştur, listele, çıkart — üçü de benzer sözdizimi, tek harf fark.
# Arşiv OLUŞTUR (-c create, -v verbose, -f dosya)
tar -cvf arsiv.tar dizin/ # sıkıştırmasız
tar -czf arsiv.tar.gz dizin/ # gzip ile
# Arşivi LISTELE (-t list)
tar -tvf arsiv.tar # sıkıştırmasız
tar -tzf arsiv.tar.gz # gzip'li
# Arşivden ÇIKART (-x extract)
tar -xvf arsiv.tar # mevcut dizine
tar -xzf arsiv.tar.gz # gzip'li, mevcut dizine
tar -czf arsiv.tar.gz dizin/ — dizin/ altındaki tüm dosyaları sırasıyla tar'a yazar, ardından pipe üzerinden gzip'e verir. Sonuç tek bir .tar.gz dosyası. Bayrakların sırası önemli değil ama -f'ten sonra dosya adı gelmeli: tar -cvzf veya tar cvzf veya modern tar --create --gzip --verbose --file=arsiv.tar.gz.
Tek dosya çıkart
# Arşivde ne var?
tar -tzf arsiv.tar.gz
# Sadece tek dosya çıkart
tar -xzf arsiv.tar.gz dizin/alt/dosya.txt
# Belirli bir desene uyan dosyaları çıkart
tar -xzf arsiv.tar.gz --wildcards '*.conf'
02 Sıkıştırma bayrakları
tar'a hangi sıkıştırıcı kullanacağını söyle.
.tar.gz veya .tgz. En uyumlu, hızlı, yaygın..tar.bz2. gzip'ten iyi sıkıştırma, daha yavaş. Artık çok kullanılmıyor..tar.xz. En yüksek sıkıştırma oranı, en yavaş. Linux kernel, dağıtım paketleri..tar.zst. Hız/oran dengesi en iyi. Modern Linux distro'larında varsayılan olma yolunda..tar. Stream veya pipeline için.# gzip (en yaygın)
tar -czf proje.tar.gz proje/
# xz (maksimum sıkıştırma)
tar -cJf proje.tar.xz proje/
# zstd (hız + oran dengesi)
tar --zstd -cf proje.tar.zst proje/
# Sıkıştırma seviyesi (gzip için -1 hızlı, -9 maksimum)
tar -czf proje.tar.gz --gzip proje/ # env GZIP=-9 ile seviye
GZIP=-9 tar -czf proje.tar.gz proje/
# zstd seviyesi (1-22, varsayılan 3)
ZSTD_CLEVEL=15 tar --zstd -cf proje.tar.zst proje/
# Uzantıya göre otomatik sıkıştırma (-a)
tar -caf proje.tar.xz proje/ # -a: uzantıdan sıkıştırıcıyı anla
tar -caf proje.tar.zst proje/
tar -caf dosya.tar.xz — GNU tar, uzantıdan sıkıştırma yöntemini anlar. .tar.gz → gzip, .tar.xz → xz, .tar.zst → zstd. Uzantıyı doğru yazmayı unutma.
03 Çıkartma seçenekleri — -C, --strip-components
Nereye çıkartılacağını ve dizin yapısını nasıl işleyeceğini kontrol et.
# Belirli dizine çıkart (-C)
tar -xzf arsiv.tar.gz -C /tmp/hedef/
# Önce hedef dizini oluştur
mkdir -p /tmp/hedef && tar -xzf arsiv.tar.gz -C /tmp/hedef/
# Üst dizinleri strip et (--strip-components)
# Arşiv: proje-1.0/src/main.c → sadece src/main.c istiyoruz
tar -xzf proje-1.0.tar.gz --strip-components=1
# → src/main.c (proje-1.0/ kaldırıldı)
# İki seviye strip
tar -xzf arsiv.tar.gz --strip-components=2
# a/b/dosya.txt → dosya.txt
proje-1.0/ öneki olmadan çıkartmak için yaygın.Güvensiz kaynaklardan gelen arşivler ../../../etc/passwd gibi yol atlatma saldırıları içerebilir (zip slip). GNU tar bunu varsayılan olarak engeller. Önce tar -t ile içeriği kontrol et.
04 Filtreleme — --exclude, --exclude-from, -T
Arşive neyi dahil etmeyeceğini ve neyi dahil edeceğini kontrol et.
# Tek dizini dışla
tar -czf proje.tar.gz proje/ --exclude 'proje/node_modules'
# Birden fazla exclude
tar -czf proje.tar.gz proje/ \
--exclude 'proje/node_modules' \
--exclude 'proje/.git' \
--exclude '*.log'
# exclude listesi dosyadan
# .tarignore dosyası içeriği:
# node_modules
# .git
# *.log
# dist/
tar -czf proje.tar.gz proje/ --exclude-from .tarignore
# Dahil edilecek dosyalar listesinden arşiv oluştur (-T)
find proje/ -name '*.py' > py_files.txt
tar -czf sadece_python.tar.gz -T py_files.txt
# -T ile stdin'den liste (NUL güvenli)
find proje/ -name '*.py' -print0 | tar -czf sadece_python.tar.gz --null -T -
-T - ile stdin'den oku.05 gzip, xz, zstd tek başına
Tek dosyayı sıkıştırmak için tar'a gerek yok.
gzip
# Dosyayı sıkıştır (orijinali siler, .gz oluşturur)
gzip büyük_dosya.log
# → büyük_dosya.log.gz
# Sıkıştırma seviyesi (-1 hız, -9 maksimum oran, varsayılan -6)
gzip -9 büyük_dosya.log
# Orijinali koru (-k keep)
gzip -k büyük_dosya.log
# Aç
gunzip büyük_dosya.log.gz
# veya:
gzip -d büyük_dosya.log.gz
# Açmadan içeriği göster
zcat büyük_dosya.log.gz
zcat büyük_dosya.log.gz | grep 'ERROR'
# Bilgi göster
gzip -l dosya.gz
xz
# Sıkıştır (-0 hızlı, -9 maksimum, varsayılan -6)
xz büyük_dosya.log
# Orijinali koru
xz -k büyük_dosya.log
# Paralel sıkıştırma (birden fazla thread)
xz -T4 büyük_dosya.log # 4 thread
xz -T0 büyük_dosya.log # CPU sayısına göre otomatik
# Aç
unxz büyük_dosya.log.xz
# Açmadan oku:
xzcat büyük_dosya.log.xz | grep 'ERROR'
zstd
# Sıkıştır (varsayılan 3, 1-22 arası)
zstd büyük_dosya.log
# Seviye belirle
zstd -15 büyük_dosya.log # yüksek oran
zstd -1 büyük_dosya.log # maksimum hız
# Paralel thread
zstd -T4 büyük_dosya.log
# Orijinali koru (zstd varsayılan olarak korur)
zstd büyük_dosya.log # log + log.zst
# Aç
unzstd büyük_dosya.log.zst
# Açmadan oku:
zstdcat büyük_dosya.log.zst | grep 'ERROR'
Arşivi açmadan içeriği okumak için bu cat varyantları kullanışlıdır. Büyük log dosyalarında grep, awk veya less'e pipe edebilirsin — disk alanını tüketmeden.
06 Seçim rehberi
Hangi formatta ne zaman dursun?
| Format | Hız | Oran | Ne zaman |
|---|---|---|---|
| .tar.gz / .tgz | Hızlı | Orta | Her yerde çalışması gereken arşivler, web indirmeleri, CI artifact. En uyumlu format. |
| .tar.xz | Yavaş | En yüksek | Dağıtım paketleri, Linux kernel, disk alanı kısıtlıysa. Saatlerce süren sıkıştırmaları kaldırabiliyorsan. |
| .tar.zst | Çok hızlı | gzip'ten iyi | Günlük log yedekleme, CI pipeline, büyük veri aktarımı. Modern ve dengeli. |
| .tar.bz2 | Yavaş | Orta | Artık önerilmiyor. Eski arşivleri okumak için destek yeterli. |
| .zip | Orta | Düşük | Windows ile dosya alışverişi, GUI araçlarla açılacak arşivler. |
| .tar (sıkıştırmasız) | Çok hızlı | — | LAN aktarımı, pipe'a gönderim, zaten sıkıştırılmış içerikler (jpg, mp4). |
Şüphe durumunda .tar.gz — her Unix/Linux sistemi açar. Büyük ve tekrar indirmeyeceğin arşivler için .tar.xz. Hızlı yedek veya pipeline için .tar.zst.
07 zip ve unzip
Windows uyumluluğu gerektiğinde ve GUI araçlarla paylaşım için.
# Dizin arşivle
zip -r arsiv.zip dizin/
# Sıkıştırma seviyesi (-0 hız, -9 maksimum)
zip -r9 arsiv.zip dizin/
# Belirli dosyalar
zip belgeler.zip *.pdf *.docx
# Şifreli zip (-e ile interaktif parola)
zip -re gizli.zip dizin/
# İçeriği listele
unzip -l arsiv.zip
# Çıkart
unzip arsiv.zip
# Belirli dizine çıkart
unzip arsiv.zip -d /tmp/hedef/
# Var olan dosyaları atla (-n) veya hepsini üzerine yaz (-o)
unzip -n arsiv.zip # mevcut dosyaları koru
unzip -o arsiv.zip # hepsini üzerine yaz
zip'in klasik şifreleme algoritması (ZipCrypto) zayıftır — gerçek güvenlik için 7-Zip veya GPG kullan. zip -re bir parola sorar ama bu şifreleme kırılabilir.
08 Pratik tarifler
Kopyalayıp çalıştırılabilecek hazır kalıplar.
Tarihli yedek al
# YYYY-MM-DD damgasıyla
tar -czf "yedek-$(date +%Y-%m-%d).tar.gz" /etc/nginx/
# Saat dahil
tar -czf "yedek-$(date +%Y%m%d-%H%M%S).tar.gz" /etc/nginx/
Dizini başka sunucuya gönder (SSH üzerinden)
# Sıkıştır, SSH tünelinden gönder, karşıda aç
tar -czf - proje/ | ssh prod 'tar -xzf - -C /var/www/'
# Çıktıyı dosyaya yazmadan pipe: -f - stdout'a yaz
node_modules ve .git hariç proje yedekle
tar -czf proje-yedek.tar.gz proje/ \
--exclude 'proje/node_modules' \
--exclude 'proje/.git' \
--exclude 'proje/dist' \
--exclude '*.log'
Büyük log dosyalarını zstd ile hızla sıkıştır
# 30 günden eski .log → .log.zst (paralel, 4 thread)
find /var/log/app -name '*.log' -mtime +30 -print0 \
| xargs -0 -P4 zstd -T1 --rm
# --rm: orijinal dosyayı sil
Hatırlanacaklar
- tar oluştur:
tar -czf arsiv.tar.gz dizin/ - tar listele:
tar -tzf arsiv.tar.gz - tar çıkart:
tar -xzf arsiv.tar.gz -C /hedef/ - sıkıştırma:
-z=gzip,-J=xz,--zstd=zstd,-j=bzip2 - strip ön dizin:
--strip-components=1 - dışla:
--exclude 'desen'veya--exclude-from dosya - pipe ile gönder:
tar -czf - dizin/ | ssh host 'tar -xzf - -C /hedef/' - açmadan oku:
zcat / xzcat / zstdcat | grep - Windows paylaşımı:
zip -r arsiv.zip dizin/