diff komutu: dosya karşılaştırma, diff -u yama biçimi ve seçenekler

Test ortamıRHEL ailesiAlmaLinux 9.8root hesabı

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/work
cat config-old.conf
# app config
listen 80
server_name example.com
root /var/www/html
gzip off
log_level warn
cat 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.conf
2,3c2,3
< listen 80
< server_name example.com
---
> listen 443
> server_name example.com www.example.com
5d4
< gzip off
6a6
> cache on
echo $?
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.conf
echo $?
0

Olmayan bir dosya verilirse hata iletisi çıkar ve çıkış kodu 2 olur.

diff config-old.conf nosuch.conf
diff: nosuch.conf: No such file or directory
echo $?
2

Betiklerde 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 on

Baş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 on

Aynı 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.patch
echo $?
1
cat /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 on

Kaydedilen 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.txt
Listen 80
ServerName example.com
DocumentRoot /var/www/html
cat case-b.txt
listen 80
ServerName  example.com

DocumentRoot /var/www/html
diff case-a.txt case-b.txt
1,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.txt
2c2,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.txt
2a3
>

-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.txt
echo $?
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 on

Ortadaki 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.conf
listen 80                         |     listen 443
server_name example.com           |     server_name example.com www.ex
gzip off                          <
                                  >     cache on

Farkı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.conf
Files config-old.conf and config-new.conf differ
diff -s config-old.conf config-copy.conf
Files config-old.conf and config-copy.conf are identical

Seçenekler aşağıdaki iki sekmede toplandı.

SeçenekKopyalaAçıklama
-u, --unifiedDeğ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-caseBüyük/küçük harf farkını yok sayar
-w, --ignore-all-spaceSatır içindeki bütün boşlukları yok sayar
-b, --ignore-space-changeYalnızca boşluk sayısındaki farkı yok sayar
-B, --ignore-blank-linesBoş satır farkını yok sayar
-y, --side-by-sideİki dosyayı solda ve sağda yan yana yazdırır
-W, --widthNUMYan yana çıktının genişliğini belirler. Varsayılan değer 130 sütundur
--suppress-common-linesYan yana çıktıda aynı satırları çıkarır ve yalnızca farklı satırları yazdırır
-q, --briefYalnı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, --recursiveAlt klasörlerdeki dosyaları da karşılaştırır
SeçenekKopyalaAçıklama
-U, --unifiedNUMBirleş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-fileBir tarafta olmayan dosyayı boş dosya sayar
-x, --excludePATAdı desenle eşleşen dosyaları karşılaştırmanın dışında tutar
-I, --ignore-matching-linesREDeğişen satırların hepsi düzenli ifadeyle eşleşiyorsa o farkı yok sayar
-Z, --ignore-trailing-spaceSatır sonundaki boşlukları yok sayar
-E, --ignore-tab-expansionSekmelerin boşluğa çevrilmesinden doğan farkları yok sayar
-a, --textBütün dosyaları metin sayar
--strip-trailing-crSatı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, --versionSü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.

diff komutu simülatörüdiff · root hesabı
[root@server work]#
Klavyedeki ↑↓ tuşlarıyla daha önce yazdığınız komutları geri çağırabilirsiniz.

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-v2
Only 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-v2
Only 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-v2
Only 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

cmp iki dosyayı bayt bayt karşılaştırır ve yalnızca ilk farklı konumu yazdırır. Yazıdaki iki yapılandırma dosyası cmp ile karşılaştırıldığında sonuç [config-old.conf config-new.conf differ: char 21, line 2] şeklinde tek satırdı. Satır satır karşılaştırmanın anlamlı olmadığı sıkıştırılmış dosyaların veya görsellerin aynı olup olmadığını kontrol etmek için kullanılır.

patch komutuna sırasıyla özgün dosya ve yama dosyası verilir ([patch config-old.conf config.patch]). patch özgün dosyayı yerinde değiştirdiğinden, sonuç -o ile başka bir dosyaya yazılır veya yama önce bir kopyaya uygulanır.

--color[=WHEN] seçeneğiyle renk eklenebilir; WHEN yerine never, always veya auto yazılır. Değer verilmeden kullanılan --color, auto ile aynıdır ve yalnızca terminale yazdırırken renk ekler; bu yüzden çıktı less gibi başka bir komuta aktarılırken de rengin kalması için --color=always kullanılır.

ℹ️ 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İnsan olduğunuzu kanıtlayın: 4   +   6   =