← man/text
diff — man diff — 80×24
ugur@toprak:~/man/text$man diff
Bölüm 1 Metin İşleme

diff

diferansiyel dosya ve dizin karşılaştırıcı

Sinopsis

     diff [-aBbdipTtw] [-c | -e | -f | -n | -q | -u | -y] [-A algo | --algorithm algo] [--brief]
	  [--color=when] [--changed-group-format GFMT] [--ed] [--expand-tabs] [--forward-ed]
	  [--ignore-all-space] [--ignore-case] [--ignore-space-change] [--initial-tab] [--minimal]
	  [--no-dereference] [--no-ignore-file-name-case] [--normal] [--rcs] [--show-c-function]
	  [--starting-file] [--speed-large-files] [--strip-trailing-cr] [--tabsize number] [--text]
	  [--unified] [-I pattern | --ignore-matching-lines pattern]
	  [-F pattern | --show-function-line pattern] [-L label | --label label] file1 file2
     diff [-aBbdilpTtw] [-A algo | --algorithm algo] [-I pattern | --ignore-matching-lines pattern]
	  [-F pattern | --show-function-line pattern] [-L label | --label label] [--brief]
	  [--color=when] [--changed-group-format GFMT] [--ed] [--expand-tabs] [--forward-ed]
	  [--ignore-all-space] [--ignore-case] [--ignore-space-change] [--initial-tab] [--minimal]
	  [--no-dereference] [--no-ignore-file-name-case] [--normal] [--paginate] [--rcs]
	  [--show-c-function] [--speed-large-files] [--starting-file] [--strip-trailing-cr]
	  [--tabsize number] [--text] -C number | --context number file1 file2
     diff [-aBbdiltw] [-A algo | --algorithm algo] [-I pattern | --ignore-matching-lines pattern]
	  [--brief] [--color=when] [--changed-group-format GFMT] [--ed] [--expand-tabs]
	  [--forward-ed] [--ignore-all-space] [--ignore-case] [--ignore-space-change]
	  [--initial-tab] [--minimal] [--no-dereference] [--no-ignore-file-name-case] [--normal]
	  [--paginate] [--rcs] [--show-c-function] [--speed-large-files] [--starting-file]
	  [--strip-trailing-cr] [--tabsize number] [--text] -D string | --ifdef string file1 file2
     diff [-aBbdilpTtw] [-A algo | --algorithm algo] [-I pattern | --ignore-matching-lines pattern]
	  [-F pattern | --show-function-line pattern] [-L label | --label label] [--brief]
	  [--color=when] [--changed-group-format GFMT] [--ed] [--expand-tabs] [--forward-ed]
	  [--ignore-all-space] [--ignore-case] [--ignore-space-change] [--initial-tab] [--minimal]
	  [--no-dereference] [--no-ignore-file-name-case] [--normal] [--paginate] [--rcs]
	  [--show-c-function] [--speed-large-files] [--starting-file] [--strip-trailing-cr]
	  [--tabsize number] [--text] -U number | --unified number file1 file2
     diff [-aBbdilNPprsTtw] [-c | -e | -f | -n | -q | -u] [-A algo | --algorithm algo] [--brief]
	  [--color=when] [--changed-group-format GFMT] [--context] [--ed] [--expand-tabs]
	  [--forward-ed] [--ignore-all-space] [--ignore-case] [--ignore-space-change]
	  [--initial-tab] [--minimal] [--new-file] [--no-dereference] [--no-ignore-file-name-case]
	  [--normal] [--paginate] [--rcs] [--recursive] [--report-identical-files]
	  [--show-c-function] [--speed-large-files] [--strip-trailing-cr] [--tabsize number]
	  [--text] [--unidirectional-new-file] [--unified]
	  [-I pattern | --ignore-matching-lines pattern] [-F pattern | --show-function-line pattern]
	  [-L label | --label label] [-S name | --starting-file name]
	  [-X file | --exclude-from file] [-x pattern | --exclude pattern] dir1 dir2
     diff [-aBbditwW] [--color=when] [--expand-tabs] [--ignore-all-space] [--ignore-blank-lines]
	  [--ignore-case] [--minimal] [--no-dereference] [--no-ignore-file-name-case]
	  [--strip-trailing-cr] [--suppress-common-lines] [--tabsize number] [--text] [--width]
	  -y | --side-by-side file1 file2
     diff [--help] [--version]

Açıklama

diff yardımcı programı file1 ve file2 dosyalarının içeriklerini karşılaştırır ve bir dosyayı diğerine dönüştürmek için gereken değişikliklerin listesini standart çıktıya yazar. Dosyalar aynı ise hiçbir çıktı üretilmez.

Çıktı seçenekleri (birbirini dışlayan):

-C number --context number -c seçeneğine benzer, ancak number satır bağlam içeren bir diff üretir.

  • -c: 3 satır bağlam içeren bir diff üretir. -c ile çıktı biçimi biraz değiştirilir: çıktı, ilgili dosyaların ve oluşturulma tarihlerinin tanımlanmasıyla başlar ve ardından her değişiklik on beş * içeren bir satırla ayrılır. file1'den kaldırılan satırlar ‘- ’ ile; file2'ye eklenen satırlar ise ‘+ ’ ile işaretlenir. Bir dosyadan diğerine değişen satırlar her iki dosyada da ‘! ’ ile işaretlenir. Birbirine 3 satır mesafede olan değişiklikler çıktıda birlikte gruplandırılır.

-D string --ifdef string Standart çıktıda file1 ve file2'nin birleştirilmiş bir sürümünü oluşturur; bu sürüme C önişlemci denetimleri dahil edilir, böylece sonucun string tanımlanmadan derlenmesi file1'in derlenmesine eşdeğer olurken, string tanımlanması file2'yi verecektir.

-e --ed ed(1) editör yardımcı programı için girdi olarak uygun bir biçimde çıktı üretir, bu çıktı daha sonra file1'i file2'ye dönüştürmek için kullanılabilir.

Dizinleri -e ile karşılaştırırken, ortaya çıkan dosyanın artık bir ed(1) betiği olarak yorumlanamayabileceğini unutmayın. Her bir ed(1) komut kümesinin hangi dosya için geçerli olduğunu belirtmek üzere çıktı eklenir. Bu parçalar, yama yapmak için patch(1) ile de uygulanabilecek bir ed(1) betiği üretmek üzere manuel olarak çıkarılabilir.

-f --forward-ed -e bayrağının çıktısıyla aynı çıktıyı üretir, ancak ters sırada verir. ed(1) tarafından işlenemez.

  • --help: Bu seçenek standart çıktıya (stdout) bir özet yazdırır ve 0 durumuyla çıkar.

  • -n: -e çıktısına benzer bir betik üretir, ancak ters sırada ve her ekleme veya silme komutunda değişen satırların sayısını gösterir. Bu, rcsdiff tarafından kullanılan biçimdir.

-q --brief Sadece dosyalar farklı olduğunda bir satır yazdırır. Değişikliklerin bir listesini çıktı olarak vermez.

-U number --unified number -u seçeneğine benzer, ancak number satır bağlam içeren bir diff üretir.

  • -u: 3 satır bağlam içeren bir birleşik (unified) diff üretir. Birleşik diff, -c seçeneğine benzer. Ancak, -c'nin aksine, değiştirilecek (eklenen ve/veya kaldırılan) tüm satırlar tek bir bölümde sunulur.

--version Bu seçenek standart çıktıya (stdout) sürüm bilgisini yazdırır ve 0 durumuyla çıkar.

-y --side-by-side Aralarında bir işaretçi bulunan iki sütun halinde çıktı verir. İşaretçi aşağıdakilerden biri olabilir:

boşluk Karşılık gelen satırlar aynıdır. '|' Karşılık gelen satırlar farklıdır. '<' Dosyalar farklıdır ve yalnızca ilk dosya bu satırı içerir. '>' Dosyalar farklıdır ve yalnızca ikinci dosya bu satırı içerir.

Karşılaştırma seçenekleri:

-A algo, --algorithm algo Dosyalar karşılaştırılırken kullanılan algoritmayı yapılandırır. diff 3 algoritmayı destekler:

myers Myers diff algoritması, bir girdiyi diğerine dönüştüren en kısa düzenlemeyi bulur. Genellikle O(N+D²) sürede çalışır ve O(N) alan gerektirir; burada N girdilerin uzunluklarının toplamı, D ise aralarındaki farkın uzunluğudur; teorik olarak en kötü durum O(N·D)'dir. En kötü durum girdisiyle karşılaşırsa, diff tarafından kullanılan uygulama daha az optimal ancak daha hızlı bir algoritmaya geri döner. patience Myers algoritmasının Patience varyantı, satırları mantıksal olarak gruplandırarak estetik açıdan daha hoş bir diff çıktısı oluşturmaya çalışır. stone Stone algoritması (genellikle Hunt-McIlroy veya Hunt-Szymanski olarak bilinir), karşılaştırılan dosyalar arasındaki en uzun ortak alt diziyi arar. Stone, uzun ortak alt diziler olduğunda en kötü durum performansıyla karşılaşır. Büyük dosyalarda bu durum önemli bir performans etkisine yol açabilir. Stone algoritması uyumluluk amacıyla korunmaktadır.

Varsayılan algoritma POSIXLY_CORRECT ve POSIX_PEDANTIC ortam değişkenlerinden etkilenir. Her iki değişken de ayarlandığında varsayılan algoritma “stone” olacaktır. Aksi takdirde, diff yardımcı programı varsayılan olarak Myers algoritmasını kullanır, ancak Myers uygulaması tarafından girdi veya çıktı seçenekleri desteklenmiyorsa Stone algoritmasına geri döner.

-a --text Tüm dosyaları ASCII metni olarak ele alır. Normalde diff, dosyalar ikili karakterler içeriyorsa yalnızca “Binary files ... differ” yazdırır. Bu seçeneğin kullanılması, diff'i bir diff üretmeye zorlar.

-B --ignore-blank-lines Yalnızca boş satırlar içeren parçaların yoksayılmasına neden olur.

-b --ignore-space-change Sondaki boşlukların (boşluklar ve sekmeler) yoksayılmasına ve diğer boşluk dizilerinin eşit olarak karşılaştırılmasına neden olur.

--color=[when] Eklemleri yeşil, silmeleri kırmızı veya DIFFCOLORS ortam değişkenindeki değerle renklendirir. when için olası değerler “never”, “always” ve “auto”dur. auto, çıktı bir tty ise ve COLORTERM ortam değişkeni boş olmayan bir dizeye ayarlanmışsa renk kullanacaktır.

-d --minimal Mümkün olduğunca küçük bir diff üretmek için çok çabalar. Bu, birçok değişikliğe sahip büyük dosyalar işlenirken çok fazla işlemci gücü ve bellek tüketebilir.

-F pattern, --show-function-line pattern -p seçeneğine benzer, ancak sağlanan modelle eşleşen son satırı görüntüler.

-I pattern --ignore-matching-lines pattern Satırları genişletilmiş düzenli ifade pattern (model) ile eşleşen değişiklikleri, eklemeleri ve silmeleri yoksayar. Birden fazla -I seçeneği belirtilebilir. Değişikliğin yoksayılması için değişiklikteki tüm satırların bir modelle eşleşmesi gerekir. Düzenli ifade modelleri hakkında daha fazla bilgi için re_format(7) sayfasına bakın.

-i --ignore-case Harflerin büyüklük-küçüklük durumunu yoksayar. Örneğin, “A” ile “a” eşit olarak karşılaştırılacaktır.

-l --paginate Çıktıyı sayfalandırmak için pr(1) aracılığıyla geçirir.

-L label --label label Bağlam veya birleşik diff üstbilgisinde birinci (ve bu seçenek iki kez belirtilmişse ikinci) dosya adı ve zamanı yerine label yazdırır.

-p --show-c-function Birleşik ve bağlam diff'lerinde, her değişiklikle birlikte, bir harf, alt çizgi veya dolar işaretiyle başlayan bağlam başlangıcından önceki son satırın ilk 40 karakterini gösterir. Standart düzen kurallarına uyan C ve Objective-C kaynak kodları için bu, değişikliğin uygulandığı işlevin prototipini gösterecektir.

-T --initial-tab Normal, bağlam veya birleşik çıktı biçimleri için satırın geri kalanından önce boşluk yerine bir sekme (tab) yazdırır. Bu, satırdaki sekmelerin hizalamasını tutarlı hale getirir.

-t --expand-tabs Çıktı satırlarındaki sekmeleri genişletir. Normal veya -c çıktısı, orijinal kaynak satırlarının girintisini bozabilecek ve çıktı listesinin yorumlanmasını zorlaştırabilecek şekilde her satırın önüne karakter(ler) ekler. Bu seçenek, orijinal kaynağın girintisini koruyacaktır.

-w --ignore-all-space -b --ignore-space-change seçeneğine benzer ancak boşluk karakterlerinin (boşluklar ve sekmeler) tamamen yoksayılmasına neden olur. Örneğin, “if ( a == b )”, “if(a==b)” ile eşit olarak karşılaştırılacaktır.

-W number --width number Yan yana (side-by-side) biçimini kullanırken en fazla number sütun çıktı verir. Varsayılan değer 130'dur. -t belirtilmediği sürece, diff'in ikinci sütunu her zaman bir sekme durağına hizalayacağını unutmayın; bu nedenle --width için --tabsize değerinin yaklaşık beş katından daha küçük değerler şaşırtıcı sonuçlar doğurabilir.

--changed-group-format GFMT Sağlanan biçimde girdi gruplarını biçimlendirir.

biçim, özel anahtar kelimeler içeren bir dizedir:

%< FILE1'den satırlar

%< FILE2'den satırlar

--ignore-file-name-case dosya adlarını karşılaştırırken büyük/küçük harf durumunu yoksayar

--no-dereference sembolik bağları takip etmez

--no-ignore-file-name-case dosya adlarını karşılaştırırken büyük/küçük harf durumunu yoksaymaz (varsayılan)

--normal varsayılan diff çıktısı

--speed-large-files GNU diff ile uyumluluk için geçici (stub) seçenek

--strip-trailing-cr girdi dosyadorlarındaki satır sonu satır başı karakterini (carriage return) kaldırır

--suppress-common-lines Yan yana biçimini kullanırken ortak satırları çıktıya yazmaz

--tabsize number Bir sekmeyi temsil eden boşluk sayısı (varsayılan 8)

Dizin karşılaştırma seçenekleri:

-N --new-file Bir dosya yalnızca bir dizinde bulunursa, diğer dizinde de bulunuyormuş ancak boyutu sıfırmış gibi davranır.

-P --unidirectional-new-file Bir dosya yalnızca dir2 içinde bulunursa, dir1 içinde de bulunuyormuş ancak boyutu sıfırmış gibi davranır.

-r --recursive Karşılaşılan ortak alt dizinlere diff'in özyinelemeli (recursively) olarak uygulanmasına neden olur.

-S name --starting-file name Bir dizin diff'ini ortasından, name dosyasından başlayarak yeniden başlatır.

-s --report-identical-files Aksi takdirde bahsedilmeyen aynı olan dosyaların diff tarafından rapor edilmesine neden olur.

-X file --exclude-from file Dosya adı tabanları file içindeki satırlarla eşleşen dosyaları ve alt dizinleri karşılaştırmanın dışında tutar. Birden fazla -X seçeneği belirtilebilir.

-x pattern --exclude pattern Dosya adı tabanları pattern ile eşleşen dosyaları ve alt dizinleri karşılaştırmanın dışında tutar. Modeller fnmatch(3) aracılığıyla kabuk tarzı eşleştirme kullanılarak eşleştirilir. Birden fazla -x seçeneği belirtilebilir.

Her iki argüman da dizin ise, diff dizinlerin içeriklerini ada göre sıralar ve ardından farklı olan metin dosyaları üzerinde değişiklik listesi üreterek normal dosya diff algoritmasını çalıştırır. Farklı olan ikili dosyalar, ortak alt dizinler ve yalnızca bir dizinde görünen dosyalar bu şekilde tanımlanır. Dizin modunda yalnızca normal dosyalar ve dizinler karşılaştırılır. Aygıt özel dosyası veya FIFO gibi normal olmayan bir dosyayla karşılaşılırsa, bir teşhis mesajı yazdırılır.

file1 ve file2'den yalnızca biri dizin ise, diff normal olmayan dosyaya ve dizin dosyası içinde normal olmayan dosyanın son bileşeniyle aynı ada sahip olan dosyaya uygulanır.

file1 veya file2'den biri ‘-’ ise, yerine standart girdi kullanılır.

Çıktı Stili Varsayılan (yoğun veya -e, -c, veya -n --rcs seçenekleri olmadan) çıktı, XX, YY, ZZ, QQ dosya sırasına göre satır numaraları olmak üzere bu biçimlerde satırlar içerir.

XXaYY file1'in XX satırına (sonuna), bunları eşit kılmak için file2'nin YY satırının içeriğini ekleyin. XXaYY,ZZ Yukarıdaki ile aynıdır, ancak file2'nin YY'den ZZ'ye kadar olan satır aralığını file1'in XX satırına ekleyin. XXdYY XX satırında satırı silin. YY değeri, değişikliğin file1'i file2 ile uyumlu hale getirmek için hangi satıra getireceğini söyler. XX,YYdZZ file1'deki XX'den YY'ye kadar olan satır aralığını silin. XXcYY file1'deki XX satırını file2'deki YY satırı ile değiştirin. XX,YYcZZ Belirtilen satır aralığını ZZ satırı ile değiştirin. XX,YYcZZ,QQ file1'den XX,YY aralığını file2'den ZZ,QQ aralığı ile değiştirin.

Bu satırlar, file1'i file2'ye dönüştürmek için ed(1) alt komutlarına benzer. Eylem harflerinden önceki satır numaraları file1 ile; sonrakiler ise file2 ile ilgilidir. Bu nedenle, a harfini d ile değiştirerek ve satırı ters sırada okuyarak, file2'nin file1'e nasıl dönüştürüleceği de belirlenebilir. ed(1)'de olduğu gibi, aynı çiftler (num1 = num2 olduğunda) tek bir sayı olarak kısaltılır.

Ortam

DIFFCOLORS Bu değişkenin değeri add:rm biçimindedir; burada add eklemeler için ASCII kaçış dizisi, rm ise silmeler için ASCII kaçış dizisidir. Bu ayarlanmamışsa, diff eklemeler için yeşili, silmeler için kırmızıyı kullanır.

Dosyalar

/tmp/diff.XXXXXXXX Bir aygıtı veya standart girdiyi karşılaştırırken kullanılan geçici dosya. Geçici dosyanın oluşturulur oluşturulmaz bağı çözüldüğünden (unlinked), dizin listesinde görünmeyeceğini unutmayın.

Çıkış Durumu

diff yardımcı programı aşağıdaki değerlerden biriyle çıkar:

0 Hiçbir fark bulunamadı. 1 Farklar bulundu.

1 Bir hata oluştu.

--help ve --version seçenekleri 0 durumuyla çıkar.

Örnekler

     old_dir ve new_dir dizinlerini özyinelemeli olarak karşılaştırıp birleşik (unified) bir diff oluşturun ve yalnızca bu dizinlerden birinde bulunan dosyaları yeni dosyalar olarak değerlendirin:

	   $ diff -ruN /path/to/old_dir /path/to/new_dir

     Yukarıdaki ile aynıdır ancak “*.h” ve “*.c” ifadeleriyle eşleşen dosyaları hariç tutar:

	   $ diff -ruN -x '*.h' -x '*.c' /path/to/old_dir /path/to/new_dir

     Dosyaların farklı olup olmadığını gösteren tek bir satır görüntüleyin:

	   $ diff -q /boot/loader.conf /boot/defaults/loader.conf
	   Files /boot/loader.conf and /boot/defaults/loader.conf differ

     Aşağıdaki içeriğe sahip example.txt adında bir dosya olduğunu varsayalım:

	   FreeBSD is an operating system
	   Linux is a kernel
	   OpenBSD is an operating system

     Standart girdiyi (stdin) example.txt ile karşılaştırın ve "Linux" veya "Open" içeren satırları karşılaştırmanın dışında tutun:

	   $ echo "FreeBSD is an operating system" | diff -q -I 'Linux|Open' example.txt -

Eski Sürüm Açıklaması

Birleşik diff biçiminin zaman damgaları eski modda farklı şekilde biçimlendirilir. Varsayılan olarak, diff birleşik diff zaman damgalarına nanosaniye veya saat dilimi eklemez. Eski modda hem nanosaniye hem de saat dilimi dahil edilir. patch(1) programının eski biçimdeki zaman damgalarını işleyemeyebileceğini unutmayın.

Eski mod hakkında daha fazla bilgi için compat(5) sayfasına bakın.

Ayrıca Bakınız

cmp(1), comm(1), diff3(1), ed(1), patch(1), pr(1), sdiff(1), compat(5)

James W. Hunt ve M. Douglas McIlroy, “An Algorithm for Differential File Comparison”, Computing Science Technical Report, Bell Laboratories 41, June 1976.

Standartlar

diff yardımcı programı IEEE Std 1003.1-2008 (“POSIX.1”) spesifikasyonu ile uyumludur.

[-AaDdIiLlNnPpqSsTtwXxy] bayrakları bu spesifikasyonun uzantılarıdır.

Geçmiş

Sürüm 6 AT&T UNIX'te bir diff komutu ortaya çıktı. FreeBSD'de kullanılan diff uygulaması, FreeBSD 11.4'e kadar GNU diff idi. Bu, FreeBSD 12.0'da Todd Miller tarafından yazılan BSD lisanslı bir uygulama ile değiştirildi. Süreçte bazı GNU özellikleri (GNUisms) kayboldu.

libdiff, Game of Trees sürüm kontrol sisteminden içe aktarıldı ve varsayılan algoritma FreeBSD 15 için Myers olarak değiştirildi.

macOS 26.4 7 Ocak 2025 macOS 26.4