diff komutu: dosya karşılaştırma, diff -u yama biçimi ve seçenekler
diff komutu, iki dosyayı satır satır karşılaştırıp yalnızca farklı satırları yazdıran bir Linux komutudur. Bir web sunucusu yapılandırmasını taklit eden eski ve yeni dosya diff ile karşılaştırıldığında değişen üç yer 2,3c2,3, 5d4 ve 6a6 olmak üzere üç satırda görüldü; -u seçeneğiyle kaydedilen yama dosyasında ise aynı değişiklikler eksi ve artı işaretleriyle düzenlenmişti.
Aşağıdaki çıktıda yer alan dosya adları ve içerikleri ile /root/work çalışma klasörü örnek değerlerdir. Karşılaştırılan dosyaların hepsi deneme için oluşturulmuş küçük dosyalardır.
1️⃣ diff komutunun temel kullanımı ve çıktıyı okuma
Komutun temel biçimi sırasıyla diff, seçenekler, ilk dosya ve ikinci dosyadır. İlk dosyayı ikinci dosyayla aynı yapmak için hangi satırların değiştirilmesi, silinmesi veya eklenmesi gerektiği satır numaralarıyla birlikte yazdırılır.
Karşılaştırmada kullanılan iki dosya, bir web sunucusu yapılandırmasını taklit eden altı satırlık dosyalardır.
cd /root/workcat config-old.conf# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warncat config-new.conf# app config
listen 443
server_name example.com www.example.com
root /var/www/html
log_level warn
cache onİki dosya seçenek verilmeden karşılaştırıldı.
diff config-old.conf config-new.conf2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache onecho $?1Çıktıda konum satırları ile içerik satırları sırayla gelir. Konum satırının ortasındaki harf c ise değiştirme, d ise silme, a ise eklemedir; harfin solundaki sayılar ilk dosyanın, sağındakiler ikinci dosyanın satır numaralarıdır. Fark varsa çıkış kodu 1 olur.
| Çıktı | Anlamı |
|---|---|
| 2,3c2,3 | İlk dosyanın 2–3. satırları ikinci dosyanın 2–3. satırlarıyla değiştirilir (change) |
| 5d4 | İlk dosyanın 5. satırı silinir (delete). Silinince ikinci dosyanın 4. satırının sonrasıyla eşleşir |
| 6a6 | İlk dosyanın 6. satırından sonra ikinci dosyanın 6. satırı eklenir (add) |
| < satır | İlk dosyada bulunan satır |
| > satır | İkinci dosyada bulunan satır |
| --- | Değiştirilen satırlarda (c) ilk dosya tarafı ile ikinci dosya tarafı arasındaki sınır |
İçeriği aynı olan dosyalar karşılaştırıldığında hiçbir şey yazdırılmaz ve komut 0 çıkış koduyla biter.
diff config-old.conf config-copy.confecho $?0Olmayan bir dosya verilirse hata iletisi çıkar ve çıkış kodu 2 olur.
diff config-old.conf nosuch.confdiff: nosuch.conf: No such file or directoryecho $?2Betiklerde bu üç değerle aynı, farklı ve hata durumları ayırt edilir.
2️⃣ diff -u birleşik biçimi ve yama dosyası
Varsayılan çıktıda yalnızca değişen satırlar yer aldığından, yüzlerce satırlık bir yapılandırma dosyasında o satırların hangi ayarın yakınında olduğunu bulmak zordur. -u eklendiğinde çıktı, değişen satırların önündeki ve arkasındaki üçer satırı da bir araya getiren birleşik biçimde (unified) verilir.
diff -u config-old.conf config-new.conf--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache onBaştaki iki satırda (---, +++) iki dosyanın adı ve değiştirilme zamanı yer alır; @@ -1,6 +1,6 @@ satırı ise ilk dosyanın 1. satırından başlayan 6 satır ile ikinci dosyanın 1. satırından başlayan 6 satırı bir araya getiren öbektir (hunk). Onun altındaki satırlarda baştaki - ilk dosyadan silinen satırı, + ikinci dosyaya eklenen satırı, boşluk ise iki dosyada da aynı olan satırı gösterir.
-c bağlam biçimidir (context). İlk dosyanın öbeği ile ikinci dosyanın öbeği ayrı ayrı yazdırılır; değişen satırların önüne ünlem, silinen satırlara eksi, eklenen satırlara artı işareti konur.
diff -c config-old.conf config-new.conf*** config-old.conf Thu Oct 29 02:24:50 2026
--- config-new.conf Thu Oct 29 02:24:50 2026
***************
*** 1,6 ****
# app config
! listen 80
! server_name example.com
root /var/www/html
- gzip off
log_level warn
--- 1,6 ----
# app config
! listen 443
! server_name example.com www.example.com
root /var/www/html
log_level warn
+ cache onAynı değişiklikte -c çıktısı, değişmeyen satırlar iki öbekte de birer kez yer aldığı için -u çıktısından daha uzun oldu.
-u çıktısı bir dosyaya kaydedildiğinde o dosya doğrudan yama dosyası olur. Çıktı dosyaya yönlendirilse de diff komutunun çıkış kodu yine 1 olur.
diff -u config-old.conf config-new.conf > /root/work/config.patchecho $?1cat /root/work/config.patch--- config-old.conf 2026-10-29 02:24:50.840228932 +0000
+++ config-new.conf 2026-10-29 02:24:50.840228932 +0000
@@ -1,6 +1,6 @@
# app config
-listen 80
-server_name example.com
+listen 443
+server_name example.com www.example.com
root /var/www/html
-gzip off
log_level warn
+cache onKaydedilen dosyanın içeriği, ekrana yazdırılan -u sonucuyla aynıdır. Bu dosya patch komutuna verildiğinde ilk dosya ikinci dosyayla aynı içeriğe getirilebilir.
3️⃣ diff seçenekleri ile boşlukları ve büyük/küçük harfi yok sayma
Ayarlar elle aktarıldığında, içeriği aynı olup yalnızca büyük/küçük harfi veya boşlukları farklı olan satırlar ortaya çıkar. İkinci örnek dosya çiftinde ilk satırdaki büyük L küçük harfe çevrildi, ikinci satırdaki bir boşluk iki boşluk yapıldı ve bir boş satır eklendi.
cat case-a.txtListen 80
ServerName example.com
DocumentRoot /var/www/htmlcat case-b.txtlisten 80
ServerName example.com
DocumentRoot /var/www/htmldiff case-a.txt case-b.txt1,2c1,3
< Listen 80
< ServerName example.com
---
> listen 80
> ServerName example.com
>Seçenek verilmeden karşılaştırıldığında anlamı aynı olan 1–2. satırlar da değişmiş satır olarak çıkar. -i ile büyük/küçük harf yok sayıldığında Listen satırı düşer ve yalnızca ilk dosyanın 2. satırı kalır.
diff -i case-a.txt case-b.txt2c2,3
< ServerName example.com
---
> ServerName example.com
>-w eklendiğinde satır içindeki bütün boşluklar yok sayılır; böylece ServerName satırı da aynı satır olur ve yalnızca 3. satıra eklenen tek boş satır kalır. -w yerine yalnızca boşluk sayısını yok sayan -b kullanıldığında da bu dosyalarda aynı sonuç çıktı.
diff -i -w case-a.txt case-b.txt2a3
>-B de eklendiğinde boş satır farkları da yok sayıldığından komut çıktı vermeden 0 çıkış koduyla bitti.
diff -i -w -B case-a.txt case-b.txtecho $?0İki dosyayı solda ve sağda yan yana görmek için -y kullanılır. Varsayılan genişlik 130 sütun olduğundan -W 70 ile daraltıldı.
diff -y -W 70 config-old.conf config-new.conf# app config # app config
listen 80 | listen 443
server_name example.com | server_name example.com www.ex
root /var/www/html root /var/www/html
gzip off <
log_level warn log_level warn
> cache onOrtadaki dikey çizgi (|) değişen satırı, < yalnızca ilk dosyada bulunan satırı, > yalnızca ikinci dosyada bulunan satırı gösterir. Genişlik daraltıldığında uzun satırlar kesilir. server_name satırı sağ tarafta yalnızca www.ex kısmına kadar göründü.
--suppress-common-lines eklendiğinde aynı satırlar çıkarılır ve yalnızca farklı satırlar kalır.
diff -y --suppress-common-lines -W 70 config-old.conf config-new.conflisten 80 | listen 443
server_name example.com | server_name example.com www.ex
gzip off <
> cache onFarkın içeriği değil, yalnızca dosyaların aynı mı farklı mı olduğu kontrol edilecekse -q kullanılır. Dosyalar aynıyken -q hiçbir şey yazdırmadığından, aynı olduklarını bildiren bir satır almak için -s kullanılır.
diff -q config-old.conf config-new.confFiles config-old.conf and config-new.conf differdiff -s config-old.conf config-copy.confFiles config-old.conf and config-copy.conf are identicalSeçenekler aşağıdaki iki sekmede toplandı.
| Seçenek | Kopyala | Açıklama |
|---|---|---|
| -u, --unified | Değişen satırların önündeki ve arkasındaki üçer satırı da bir araya getiren birleşik biçimde yazdırır | |
| -c, --context | İlk dosyanın öbeğini ve ikinci dosyanın öbeğini ayrı ayrı yazdıran bağlam biçimi | |
| -i, --ignore-case | Büyük/küçük harf farkını yok sayar | |
| -w, --ignore-all-space | Satır içindeki bütün boşlukları yok sayar | |
| -b, --ignore-space-change | Yalnızca boşluk sayısındaki farkı yok sayar | |
| -B, --ignore-blank-lines | Boş satır farkını yok sayar | |
| -y, --side-by-side | İki dosyayı solda ve sağda yan yana yazdırır | |
| -W, --widthNUM | Yan yana çıktının genişliğini belirler. Varsayılan değer 130 sütundur | |
| --suppress-common-lines | Yan yana çıktıda aynı satırları çıkarır ve yalnızca farklı satırları yazdırır | |
| -q, --brief | Yalnızca aynı mı farklı mı olduğunu yazdırır. Aynıysa hiçbir şey yazdırmaz | |
| -s, --report-identical-files | İki dosya aynıysa aynı olduklarını bildiren bir satır yazdırır | |
| -r, --recursive | Alt klasörlerdeki dosyaları da karşılaştırır |
| Seçenek | Kopyala | Açıklama |
|---|---|---|
| -U, --unifiedNUM | Birleşik biçimde birlikte yazdırılacak önceki ve sonraki satır sayısını belirler. Varsayılan değer 3'tür | |
| -N, --new-file | Bir tarafta olmayan dosyayı boş dosya sayar | |
| -x, --excludePAT | Adı desenle eşleşen dosyaları karşılaştırmanın dışında tutar | |
| -I, --ignore-matching-linesRE | Değişen satırların hepsi düzenli ifadeyle eşleşiyorsa o farkı yok sayar | |
| -Z, --ignore-trailing-space | Satır sonundaki boşlukları yok sayar | |
| -E, --ignore-tab-expansion | Sekmelerin boşluğa çevrilmesinden doğan farkları yok sayar | |
| -a, --text | Bütün dosyaları metin sayar | |
| --strip-trailing-cr | Satır sonundaki satır başı karakterini ayırıp karşılaştırır | |
| --colorWHEN | Çıktıyı renklendirir. WHEN never, always veya auto olabilir | |
| -v, --version | Sürüm bilgisini yazdırır |
🔲 diff komutu simülatörü
Aşağıdaki simülatörde yazıdaki örnek dosyalarla diff komutu doğrudan yazılabilir. -u ile yama dosyası kaydedilebilir, -i -w -B ve -rq ile karşılaştırma yapılabilir; config-new.conf dosyasına bir satır eklenip yeniden karşılaştırıldığında değişen sonuç çıkar.
4️⃣ diff -r ile klasör karşılaştırma
Site dosyalarının yayına alınmadan önceki ve sonraki hali gibi birden çok dosya tek seferde karşılaştırılacaksa dosya yerine klasör adları yazılır. Örnek klasörler site-v1 ve site-v2 içinde index.html ile css klasörü ikisinde de vardır; about.html ve contact.html ise yalnızca birer tarafta bulunur.
diff site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Common subdirectories: site-v1/css and site-v2/css
diff site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>Klasörler seçenek verilmeden karşılaştırıldığında yalnızca bir tarafta bulunan dosyalar [Only in] satırıyla, alt klasörler ise yalnızca [Common subdirectories] satırıyla gösterilir ve alt klasörlerdeki dosyalar karşılaştırılmaz. İki klasörde aynı adla bulunan index.html için farklar [diff site-v1/index.html site-v2/index.html] satırının altında yazdırılır. -r eklendiğinde css klasöründeki style.css dosyasında değişen renk değeri de yazdırılır.
diff -r site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
diff -r site-v1/css/style.css site-v2/css/style.css
2c2
< h1 { color: #222; }
---
> h1 { color: #0a58ca; }
diff -r site-v1/index.html site-v2/index.html
2,3c2,3
< <p>Version 1</p>
< <a href="about.html">About</a>
---
> <p>Version 2</p>
> <a href="contact.html">Contact</a>Çok dosya içeren klasörlerde önce -rq ile değişen dosyaların listesine bakılır, ardından yalnızca gereken dosyalar diff ile yeniden karşılaştırılır.
diff -rq site-v1 site-v2Only in site-v1: about.html
Only in site-v2: contact.html
Files site-v1/css/style.css and site-v2/css/style.css differ
Files site-v1/index.html and site-v2/index.html differ🔢 SSS & önerilen içerikler
Linux · Metin
Linux grep komutu
Günlük dosyası gibi metin dosyalarında yalnızca istenen dizgeyi içeren satırları bulup yazdıran grep'in kullanımı.
Linux · Metin
Linux sort komutu: Dosya sıralama
Dosya içeriğini alfabetik ya da artan veya azalan sırada sıralayan sort seçenekleri ve kullanım örnekleri.
Linux · Metin
Linux uniq komutu
Yinelenen satırlardan yalnızca birini bırakan ve -c ile kaç kez tekrarlandığını sayan uniq'in kullanımı.
ℹ️ Satış ortaklığı bildirimi
Bu sitenin içeriklerinde satış ortaklığı bağlantıları bulunur. Bir ziyaretçi bu bağlantılar üzerinden ürün veya hizmet satın alırsa bu site satıcıdan komisyon alır. Bu süreçte alıcının ödediği tutar (kampanya indirimlerinde tutar düşer↓) artmaz. Yayımlanan fiyat, indirim ve stok bilgileri yazının yazıldığı zamana aittir ve gerçek durumdan farklı olabilir; bu yüzden satın almadan önce son bilgiyi satıcıdan kontrol etmenizi rica ederiz. Ürünler kendi ölçütlerimize göre seçilir ve değerlendirilir; komisyon alınıp alınmaması tanıtım sırasını veya değerlendirme içeriğini etkilemez.