Linux/Unix 'diff' Komutu Bilgi Bankası ve Hile Sayfası

Bu makale, dosya ve dizin farklılıklarını karşılaştırmak için kullanılan 'diff' komutunun temel kullanımlarını, yaygın çıktı sembollerini ve yama (patch) iş akışlarını detaylıca açıklar.

L
Linuxize
11 görüntülenme
Linux/Unix 'diff' Komutu Bilgi Bankası ve Hile Sayfası

Linux/Unix 'diff' Komutu Bilgi Bankası ve Hile Sayfası

Zorluk Seviyesi: Intermediate

diff komutu, iki dosya veya dizin arasındaki farklılıkları satır bazında karşılaştırmak için kullanılan temel bir Unix/Linux aracıdır. Yazılım geliştirme, sürüm kontrolü ve sistem yönetimi görevlerinde kritik öneme sahiptir.

Temel Kullanım ve Çıktı Formatları

diff komutunun en yaygın kullanım şekli, iki dosya arasındaki değişiklikleri görüntülemektir. Farklı çıktı formatları, bu değişikliklerin nasıl sunulacağını belirler.

Temel Karşılaştırma Komutları

# Normal formatta karşılaştırma (eski standart) 
diff dosya1 dosya2

# Birleşik (Unified) format (En yaygın ve yama dosyaları için tercih edilen) 
diff -u dosya1 dosya2

# Bağlam (Context) formatı
diff -c dosya1 dosya2

# Yan Yana (Side-by-side) formatı
diff -y dosya1 dosya2

# Farkı bir yama dosyasına kaydetme
diff -u dosya1 dosya2 > dosya.yama

İpucu: Yama dosyaları oluştururken -u (Unified) formatı kullanmak standarttır, çünkü patch komutu bu formatı en verimli şekilde işler.

'diff' Çıktı Sembolleri Anlamları

Farklılık çıktılarında kullanılan semboller, hangi dosyanın etkilendiğini ve işlemin ne olduğunu gösterir. Özellikle normal, unified ve context formatlarında bu semboller farklılık gösterir.

Sembol Format Anlamı
< normal Sadece dosya1'de bulunan satır (silinmiş)
> normal Sadece dosya2'de bulunan satır (eklenmiş)
- unified/context Satır silindi (dosya1'den kaldırıldı)
+ unified/context Satır eklendi (dosya2'ye eklendi)
! context Satır her iki dosyada da mevcut ancak değiştirildi
@@ unified Hunk başlığı; satır numaralarını ve değişiklik bloğunu belirtir.

Dizin Karşılaştırması

diff komutu, tek tek dosyaların yanı sıra tüm dizin ağaçlarını da özyinelemeli olarak karşılaştırabilir. Bu, büyük kod tabanlarını veya yapılandırma dizinlerini senkronize etmek için kullanışlıdır.

  1. Özyinelemeli Karşılaştırma: Tüm alt dizinleri ve dosyaları karşılaştırır.
  2. Sadece Farklı Dosyaları Raporlama: Yalnızca hangi dosyaların farklı olduğunu görmek için kullanılır, detaylı satır farklarını göstermez.
  3. Eksik Dosyaları Boş Kabul Etme: Bir dizinde olup diğerinde olmayan dosyaları, sanki boş bir dosya ile karşılaştırılıyormuş gibi işlem görür. Bu, yama oluştururken önemlidir.
# Dizinleri özyinelemeli karşılaştır
diff -r dizin1 dizin2

# Sadece hangi dosyaların farklı olduğunu raporla
diff -rq dizin1 dizin2

# Eksik dosyaları boş kabul ederek özyinelemeli karşılaştır (yama için ideal)
diff -rN dizin1 dizin2

# Yama oluşturmak için birleşik formatta özyinelemeli fark al
diff -rNu dizin1 dizin2 > dizin.yama

Farkları Filtreleme Seçenekleri

Bazen formatlama veya büyük/küçük harf farklılıkları gibi önemsiz ayrıntıları göz ardı etmek istersiniz. Bu seçenekler, daha temiz ve anlamlı çıktılar almanızı sağlar.

  • -i: Büyük/küçük harf farklılıklarını yoksayar.
  • -w: Tüm boşluk karakterlerini (space, tab) yoksayar.
  • -b: Boşluk miktarındaki değişiklikleri yoksayar (örn: bir tab yerine üç boşluk).
  • -B: Boş satırlardaki değişiklikleri yoksayar.
  • --strip-trailing-cr: Windows stilindeki satır sonu karakterlerini (CR) yok sayar.

Yama (Patch) İş Akışı

diff'in en güçlü kullanımı, patch komutu ile birlikte kullanılarak değişiklikleri bir dosyadan diğerine veya bir dizinden diğerine uygulamaktır.

  1. Yama Oluşturma: diff -u kullanarak bir yama dosyası oluşturun.
  2. Yama Uygulama: patch komutu ile yama dosyasını orijinal dosyaya uygulayın.
  3. Yama Geri Alma: patch -R kullanarak uygulanan değişiklikleri geri alın.
# Tek dosya yama oluşturma
diff -u dosya_eski dosya_yeni > degisiklik.patch

# Yamayı uygulama
patch dosya_eski < degisiklik.patch

# Dizin yaması uygulama (genellikle -p1 kullanılır, çünkü yama dosyası dizin yapısını içerir)
patch -p1 < dizin.yama

Dikkat: Dizin yaması uygularken -pN parametresi önemlidir. Bu, yama dosyasındaki yol ön eklerinin kaç seviye kaldırılacağını belirtir. Çoğu zaman -p1 yeterlidir.

Kaynak

Linuxize