Bash tools
TEKNİK REHBER BASH TOOLS ARŞİV · SIKIŞTIRMA 2026

Arşivleme ve
sıkıştırma.

tar tek başına sıkıştırmaz — birleştirir. gzip, xz, zstd sıkıştırır. İkisini birlikte ne zaman, nasıl kullanacağını ve ne zaman zip'e geçeceğini öğren.

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 vs tar.gz

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.

bash
# 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
-c (--create)
yeni arşiv oluştur.
-t (--list)
arşiv içeriğini listele — çıkartmadan.
-x (--extract)
arşivden dosyaları çıkart.
-v (--verbose)
işlenen dosyaları göster.
-f dosya (--file)
arşiv dosyasının adı. Her zaman son seçenek olmalı (arkasından dosya adı gelir).
NE OLUYOR

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

bash
# 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.

-z / --gzip
gzip kullan → .tar.gz veya .tgz. En uyumlu, hızlı, yaygın.
-j / --bzip2
bzip2 kullan → .tar.bz2. gzip'ten iyi sıkıştırma, daha yavaş. Artık çok kullanılmıyor.
-J / --xz
xz kullan → .tar.xz. En yüksek sıkıştırma oranı, en yavaş. Linux kernel, dağıtım paketleri.
--zstd
zstd kullan → .tar.zst. Hız/oran dengesi en iyi. Modern Linux distro'larında varsayılan olma yolunda.
(yok)
sıkıştırma yok → .tar. Stream veya pipeline için.
bash
# 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/
-a ile otomatik

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.

bash
# 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
-C dizin
çıkartma hedef dizini. Önceden var olmalı.
--strip-components=N
yol bileşenlerinin N tanesini baştan at. Sürüm numaralı arşivleri proje-1.0/ öneki olmadan çıkartmak için yaygın.
-k / --keep-old-files
arşivdeki dosya varsa üzerine yazma.
--overwrite
var olan dosyaları üzerine yaz (varsayılan davranış zaten bu).
-p / --preserve-permissions
dosya izinlerini koru (root dışında varsayılan değil).
Güvenli çıkartma

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.

bash
# 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 -
--exclude 'desen'
glob desen. Tam yol veya dosya adına göre. Birden fazla kez kullanılabilir.
--exclude-from dosya
her satırda bir desen olan dosyadan exclude listesi oku.
-T dosya
arşive dahil edilecek dosyaların listesi. -T - ile stdin'den oku.
--null
-T ile NUL ayırıcı kullan (boşluklu dosya adları için, find -print0 ile birlikte).

05 gzip, xz, zstd tek başına

Tek dosyayı sıkıştırmak için tar'a gerek yok.

gzip

bash
# 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

bash
# 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

bash
# 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'
zcat / xzcat / zstdcat

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?

FormatHızOranNe zaman
.tar.gz / .tgzHızlıOrtaHer yerde çalışması gereken arşivler, web indirmeleri, CI artifact. En uyumlu format.
.tar.xzYavaşEn yüksekDağı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 iyiGünlük log yedekleme, CI pipeline, büyük veri aktarımı. Modern ve dengeli.
.tar.bz2YavaşOrtaArtık önerilmiyor. Eski arşivleri okumak için destek yeterli.
.zipOrtaDüşükWindows 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).
TEMEL KURAL

Şü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.

bash
# 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 şifreleme uyarısı

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

bash
# 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)

bash
# 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

bash
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

bash
# 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/