← Bash tools
TEKNİK REHBER BASH TOOLS KARŞILAŞTIRMA 2026

diff, patch ve checksums
fark ve bütünlük doğrulama

İki dosya arasındaki farkı bul, o farkı yamayı olarak uygula ve dosya bütünlüğünü karma ile doğrula. diff, patch, cmp, md5sum, sha256sum — dosya karşılaştırmanın tam cephaneliği.

00 diff mental modeli

diff iki dosyayı satır satır karşılaştırır ve birini diğerine dönüştürmek için gereken en küçük değişiklik kümesini üretir.

diff A B çıktısı "A'yı B'ye dönüştürmek için neler yapılmalı?" sorusunu yanıtlar. Sonuç patch olarak saklanabilir ve farklı bir kopyaya uygulanabilir.

bash
# Temel kullanım
diff eski.txt yeni.txt

# Unified format (en yaygın, git de kullanır)
diff -u eski.txt yeni.txt

--- eski.txt    2026-01-10 12:00:00
+++ yeni.txt    2026-01-10 12:05:00
@@ -3,4 +3,5 @@
 değişmeyen satır
-silinen satır
+eklenen satır
+başka eklenen
 değişmeyen satır

# Çıkış kodu: 0 = aynı, 1 = farklı, 2 = hata
diff -q a.txt b.txt && echo "Aynı" || echo "Farklı"
UNIFIED FORMAT OKUMAK

--- eski dosya, +++ yeni dosya. @@ -3,4 +3,5 @@: eski dosyada 3. satırdan 4 satır, yeni dosyada 3. satırdan 5 satır. - satır silindi, + satır eklendi, boşlukla başlayan satır değişmedi.

01 diff: temel kullanım ve formatlar

Farklı çıktı formatları farklı kullanım alanları için uygundur. Unified (-u) en geniş desteğe sahip.

bash
# Varsayılan format (normal/geleneksel)
diff a.txt b.txt

# Unified format: bağlam satırlarıyla (git diff gibi)
diff -u a.txt b.txt

# Bağlam satırı sayısı: -U N (varsayılan 3)
diff -U5 a.txt b.txt     # 5 bağlam satırı
diff -U0 a.txt b.txt     # bağlam yok (sadece değişen)

# Side-by-side karşılaştırma
diff -y a.txt b.txt
diff -y --width=120 a.txt b.txt

# Büyük/küçük harf duyarsız
diff -i a.txt b.txt

# Boşluk değişikliklerini yoksay
diff -w a.txt b.txt      # tüm boşlukları yoksay
diff -b a.txt b.txt      # ardışık boşluk farkını yoksay
diff -B a.txt b.txt      # boş satır farkını yoksay

# Sadece farklı mı sorusu (sessiz, çıkış kodu ile)
diff -q a.txt b.txt

# Renkli diff (colordiff yüklüyse)
colordiff -u a.txt b.txt
-u
Unified format — git diff, patch için standart
-U N
Unified bağlam satırı sayısı (varsayılan 3)
-y
Side-by-side karşılaştırma
-q
Quiet — sadece farklı mı/aynı mı söyle
-i
Büyük/küçük harf duyarsız
-w
Tüm boşluk değişikliklerini yoksay
-b
Ardışık boşluk farkını yoksay
-B
Boş satır farklarını yoksay

02 diff: dizin karşılaştırması

diff -r iki dizini özyinelemeli karşılaştırır. Hangi dosyaların eklendiğini, silindiğini ve değiştiğini gösterir.

bash
# Dizin karşılaştırma
diff -r dizin_A/ dizin_B/

# Unified + özyinelemeli
diff -ru dizin_A/ dizin_B/

# Sadece hangi dosyalar farklı/eksik (içerik değil)
diff -rq dizin_A/ dizin_B/
Files dizin_A/config.yaml and dizin_B/config.yaml differ
Only in dizin_B/: yeni_dosya.txt

# .git ve node_modules'ı hariç tut
diff -rq --exclude='.git' --exclude='node_modules' A/ B/

# --exclude-from: liste dosyası kullan
diff -r --exclude-from=.diffignore A/ B/

# Patch olarak kaydet (tüm dizin)
diff -ru eski/ yeni/ > degisiklikler.patch
-r
Özyinelemeli dizin karşılaştırması
--exclude=PAT
Eşleşen dosyaları yoksay. Birden fazla kullanılabilir
--exclude-from=FILE
Yoksayılacak dosya örüntüleri listesi

03 patch: diff'i uygula

patch bir diff dosyasını (yamayı) alır ve hedef dosyalara uygular. Açık kaynak dünyasının standart yama mekanizması.

bash
# Yama oluştur
diff -u eski.txt yeni.txt > degisiklik.patch

# Yamayı uygula
patch eski.txt degisiklik.patch
patching file eski.txt

# Stdin'den uygula
patch eski.txt < degisiklik.patch

# Dizin yaması (diff -ru çıktısı)
patch -p1 < degisiklikler.patch   # a/ b/ prefixleri kaldır
patch -p0 < degisiklikler.patch   # prefix kaldırma

# Kuru çalıştırma (gerçekten uygulamadan test et)
patch --dry-run -p1 < degisiklikler.patch

# Geri al (ters uygula)
patch -R eski.txt < degisiklik.patch
-p N
Dosya yollarından N dizin bileşenini kaldır. -p1 en yaygın (a/dosya → dosya)
--dry-run
Değişiklik yapmadan yamayı test et
-R
Yamayı geri al (reverse)
-b
Orijinal dosyanın yedeğini al (.orig uzantısıyla)
-p1 KURALI

diff -ru A/ B/ çıktısında dosya yolları A/dosya.txt ve B/dosya.txt şeklindedir. patch -p1 bu prefixin (A/ veya B/) bir bileşenini atar, geriye dosya.txt kalır — bu yüzden büyük çoğunlukta -p1 kullanılır.

04 cmp: byte düzeyinde karşılaştırma

cmp iki dosyayı byte byte karşılaştırır — binary dosyalar için diff'ten daha uygundur.

bash
# Temel karşılaştırma
cmp dosya_a dosya_b
dosya_a dosya_b differ: byte 42, line 3

# Aynıysa sessiz, farklıysa haber ver
cmp -s a b && echo "Aynı" || echo "Farklı"

# Tüm fark noktalarını listele
cmp -l dosya_a dosya_b
 42 101  63      # byte konumu, oct_A, oct_B

# Binary dosya farkı (image, binary)
cmp image_v1.bin image_v2.bin

# N byte'tan sonra karşılaştırmayı durdur
cmp -n 1024 a.bin b.bin  # sadece ilk 1024 byte

# diff vs cmp: metin için diff, binary için cmp
diff a.txt b.txt    # metin: satır farkını göster
cmp  a.bin b.bin    # binary: byte konumunu göster
-s
Silent — sadece çıkış kodu (0 = aynı, 1 = farklı)
-l
Tüm farklı byte'ları listele
-n N
Sadece ilk N byte'ı karşılaştır

05 md5sum ve sha256sum: karma ile doğrulama

Dosya bütünlüğünü doğrulamak için kriptografik karma. İndirilen dosyanın tam ve değiştirilmemiş olduğunu kanıtlar.

bash
# Karma hesapla
sha256sum dosya.iso
a7c3d8f1e2b456789abcdef0123456789abcdef0123456789abcdef01234567  dosya.iso

md5sum dosya.tar.gz
d41d8cd98f00b204e9800998ecf8427e  dosya.tar.gz

# Birden fazla dosya
sha256sum *.tar.gz > SHA256SUMS

# Doğrula (SHA256SUMS dosyasındaki tüm karmaları kontrol et)
sha256sum --check SHA256SUMS
dosya1.tar.gz: OK
dosya2.tar.gz: OK
dosya3.tar.gz: FAILED

# Sadece başarısızları göster
sha256sum --check --quiet SHA256SUMS

# Stdin'den karma
echo -n "merhaba" | sha256sum

# md5sum aynı arayüz
md5sum --check MD5SUMS
--check / -c
Önceden hesaplanmış karma dosyasını doğrula
--quiet
Sadece başarısız satırları göster
--status
Hiçbir şey yazdırma, sadece çıkış kodu kullan
md5sum GÜVENLİK UYARISI

MD5 kriptografik olarak kırılmıştır — güvenlik gerektiren doğrulama için kullanmayın. İndirme bütünlüğü için sha256sum, güvenlik uygulamaları için sha512sum veya b3sum tercih edin. MD5 sadece eski sistemlerin gerektirdiği durumlarda kabul edilir.

06 b3sum, sha512sum ve diğerleri

Farklı karma algoritmaları farklı güvenlik düzeyleri ve hızlar sunar. Doğru algoritmayı seçmek kullanım alanına bağlı.

bash
# SHA-1 (git'te kullanılır, artık güvensiz kabul edilir)
sha1sum dosya.txt

# SHA-256 (en yaygın güvenli seçim)
sha256sum dosya.txt

# SHA-512 (daha güçlü, büyük sunucularda hızlı)
sha512sum dosya.txt

# BLAKE3 (en hızlı, modern güvenlik) — b3sum gerekli
b3sum dosya.txt
b3sum --check B3SUMS

# openssl dgst ile herhangi bir algoritma
openssl dgst -sha256 dosya.txt
openssl dgst -sha512 dosya.txt
openssl dgst -md5 dosya.txt    # md5sum alternatifi

# xxhsum (checksum, güvenlik DEĞİL, hız için)
xxhsum buyuk_dosya.tar.gz     # hızlı bütünlük kontrolü
AlgoritmaGüvenlikHızKullanım
md5sumKırıkHızlıYalnızca eski uyumluluk
sha1sumZayıfHızlıGit (geçiş aşamasında)
sha256sumGüvenliOrtaGenel doğrulama
sha512sumÇok güvenliOrta-hızlıYüksek güvenlik
b3sumModernEn hızlıBüyük dosya doğrulama
xxhsumKriptografik değilUltra hızlıVeri bütünlüğü (güvenlik değil)

07 Pratik vakalar

Gerçek dünya senaryoları: config değişikliği takibi, indirme doğrulama, yama iş akışı.

bash — Config değişikliğini insan-okunur göster
# production.yaml'ı staging ile karşılaştır (boşluk yoksay)
diff -u -w config/staging.yaml config/production.yaml
bash — ISO indirme doğrulama
# İndirilen ISO'nun orijinalliğini doğrula
wget https://example.com/ubuntu.iso
wget https://example.com/SHA256SUMS

sha256sum --check SHA256SUMS
ubuntu.iso: OK
bash — Deploy öncesi/sonrası config farkı
# Deploy öncesi anlık görüntü
diff -rq --exclude='*.log' /etc/myapp/ /etc/myapp/ > /dev/null
sha256sum /etc/myapp/*.conf > pre_deploy.sums

# Deploy sonrası: ne değişti?
sha256sum --check pre_deploy.sums 2>&1 | grep 'FAILED'
bash — Patch iş akışı (açık kaynak katkısı)
# Değişikliği patch olarak oluştur
diff -u orijinal/dosya.c benim/dosya.c > duzeltme.patch

# Yamanın uygulanabilir olduğunu test et
patch --dry-run -p1 < duzeltme.patch
checking file dosya.c

# Uygula
patch -p1 < duzeltme.patch
bash — Otomatik yedek ile config güncelle
# İki versiyonu karşılaştır, sadece farklıysa güncelle
if ! diff -q /etc/nginx/nginx.conf nginx.conf.new >/dev/null; then
  cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
  cp nginx.conf.new /etc/nginx/nginx.conf
  nginx -s reload
fi

Hatırlanacaklar

  • diff -u: unified format — patch ve git'in standart çıktısı
  • diff -rq dizin1/ dizin2/: dizinler arasında ne farklı, kısa özet
  • patch -p1 < dosya.patch: -p1 çoğunlukla doğru seviye
  • cmp -s a b: binary karşılaştırma, sadece çıkış kodu
  • sha256sum --check SHA256SUMS: indirilen dosyayı doğrula
  • MD5 güvenlik için kullanmayınsha256sum veya daha güçlüsünü seçin
  • Karma dosyasını SHA256SUMS adıyla dağıtmak standarttır

Devam: cat, less — dosya okuma ve sayfalama · stat, file — dosya bilgisi ve tür tespiti