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.
# 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ı"
--- 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.
# 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
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.
# 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
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ı.
# 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
-p1 en yaygın (a/dosya → dosya).orig uzantısıyla)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.
# 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
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.
# 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
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ı.
# 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ü
| Algoritma | Güvenlik | Hız | Kullanım |
|---|---|---|---|
md5sum | Kırık | Hızlı | Yalnızca eski uyumluluk |
sha1sum | Zayıf | Hızlı | Git (geçiş aşamasında) |
sha256sum | Güvenli | Orta | Genel doğrulama |
sha512sum | Çok güvenli | Orta-hızlı | Yüksek güvenlik |
b3sum | Modern | En hızlı | Büyük dosya doğrulama |
xxhsum | Kriptografik değil | Ultra 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ışı.
# production.yaml'ı staging ile karşılaştır (boşluk yoksay)
diff -u -w config/staging.yaml config/production.yaml
# İndirilen ISO'nun orijinalliğini doğrula
wget https://example.com/ubuntu.iso
wget https://example.com/SHA256SUMS
sha256sum --check SHA256SUMS
ubuntu.iso: OK
# 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'
# 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
# İ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 özetpatch -p1 < dosya.patch:-p1çoğunlukla doğru seviyecmp -s a b: binary karşılaştırma, sadece çıkış kodusha256sum --check SHA256SUMS: indirilen dosyayı doğrula- MD5 güvenlik için kullanmayın —
sha256sumveya daha güçlüsünü seçin - Karma dosyasını
SHA256SUMSadıyla dağıtmak standarttır
Devam: cat, less — dosya okuma ve sayfalama · stat, file — dosya bilgisi ve tür tespiti