Özet
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, file1 ve file2 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ıysa çıktı üretmez.
file1 veya file2 değerlerinden biri - ise, onun yerine standart girdi kullanılır.
Çıktı Biçimi Seçenekleri
Aşağıdaki çıktı seçenekleri birbirini dışlar:
-C number,--context number:-cseçeneğine benzer, ancaknumbersatır bağlam içeren bir diff üretir.-c: 3 satır bağlam içeren bir diff üretir. Çıktı, ilgili dosyaların ve oluşturulma tarihlerinin tanımlanmasıyla başlar; her değişiklik on beş*içeren bir satırla ayrılır.file1içinden kaldırılan satırlar-ile,file2içine eklenen satırlar+ile, bir dosyadan diğerine değişen satırlar ise 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ıdafile1vefile2dosyalarının birleştirilmiş bir sürümünü oluşturur. Çıktıya C önişlemci denetimleri eklenir; sonuçstringtanımlanmadan derlenirsefile1,stringtanımlanarak derlenirsefile2elde edilir.-e,--ed:ed(1)için girdi olarak uygun bir çıktı üretir. Bu çıktı daha sonrafile1dosyasınıfile2dosyasına dönüştürmek için kullanılabilir.-f,--forward-ed:-ebayrağıyla aynı çıktıyı üretir, ancak ters sırada verir. Bu çıktıed(1)tarafından işlenemez.--help: Standart çıktıya kısa bir özet yazdırır ve0durumuyla çıkar.-n,--rcs:-eçıktısına benzer bir betik üretir, ancak ters sıradadır ve her ekleme veya silme komutunda değişen satırların sayısını gösterir. Bu,rcsdifftarafından kullanılan biçimdir.-q,--brief: Yalnızca dosyalar farklı olduğunda tek satır yazdırır. Değişiklik listesini çıktı olarak vermez.-U number,--unified number:-useçeneğine benzer, ancaknumbersatır bağlam içeren bir diff üretir.-u,--unified: 3 satır bağlam içeren birleşik (unified) diff üretir. Birleşik diff,-cseçeneğine benzer; ancak değiştirilecek tüm eklenen veya kaldırılan satırlar tek bir bölümde sunulur.--version: Standart çıktıya sürüm bilgisini yazdırır ve0durumuyla çıkar.-y,--side-by-side: Aralarında bir işaretçi bulunan iki sütun halinde çıktı verir.
-y çıktısında kullanılan işaretçiler:
- 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.
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 ed(1) komut kümesinin hangi dosya için geçerli olduğunu belirtmek üzere çıktıya ek bilgi eklenir. Bu parçalar, yama yapmak için patch(1) ile de uygulanabilecek bir ed(1) betiği üretmek üzere elle çıkarılabilir.
Karşılaştırma Seçenekleri
-A algo,--algorithm algo: Dosyalar karşılaştırılırken kullanılan algoritmayı yapılandırır. Desteklenen değerlermyers,patiencevestoneşeklindedir.-a,--text: Tüm dosyaları ASCII metni olarak ele alır. Normaldediff, dosyalar ikili karakterler içeriyorsa yalnızcaBinary files ... differyazdırır; bu seçenek,diffaracını 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 ve sekmelerin yoksayılmasına, diğer boşluk dizilerinin eşit olarak karşılaştırılmasına neden olur.--color=[when]: Eklemeleri yeşil, silmeleri kırmızı veyaDIFFCOLORSortam değişkenindeki değerle renklendirir.wheniçin olası değerlernever,alwaysveautoşeklindedir.auto, çıktı bir tty ise veCOLORTERMortam değişkeni boş olmayan bir dizeye ayarlanmışsa renk kullanır.-d,--minimal: Mümkün olduğunca küçük bir diff üretmek için daha fazla çalışır. Çok sayıda değişiklik içeren büyük dosyalarda fazla işlemci gücü ve bellek tüketebilir.-F pattern,--show-function-line pattern:-pseçeneğine benzer, ancak sağlanan örüntüyle eşleşen son satırı görüntüler.-I pattern,--ignore-matching-lines pattern: Satırları genişletilmiş düzenli ifadepatternile eşleşen değişiklikleri, eklemeleri ve silmeleri yoksayar. Birden fazla-Iseçeneği belirtilebilir. Değişikliğin yoksayılması için değişiklikteki tüm satırların bir örüntüyle eşleşmesi gerekir. Düzenli ifadeler hakkında daha fazla bilgi içinre_format(7)sayfasına bakın.-i,--ignore-case: Harflerin büyük/küçük durumunu yoksayar. ÖrneğinAileaeşit karşılaştırılır.-l,--paginate: Çıktıyı sayfalandırmak içinpr(1)aracından geçirir.-L label,--label label: Bağlam veya birleşik diff üstbilgisinde birinci dosya adı ve zamanı yerinelabelyazdırır. Bu seçenek iki kez belirtilirse ikinci dosya için de uygulanır.-p,--show-c-function: Birleşik ve bağlam diff'lerinde, her değişiklikle birlikte bağlam başlangıcından önceki son satırın ilk 40 karakterini gösterir; satır bir harf, alt çizgi veya dolar işaretiyle başlamalıdır. Standart düzen kurallarına uyan C ve Objective-C kaynak kodlarında bu genellikle değişikliğin uygulandığı işlev prototipini gösterir.-T,--initial-tab: Normal, bağlam veya birleşik çıktı biçimleri için satırın geri kalanından önce boşluk yerine sekme 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 karakterler eklediğinden bu seçenek kaynak girintisini korumaya yardımcı olur.-w,--ignore-all-space:-bseçeneğine benzer, ancak boşluk ve sekme karakterlerini tamamen yoksayar. Örneğinif ( a == b ),if(a==b)ile eşit karşılaştırılır.-W number,--width number: Yan yana biçimini kullanırken en fazlanumbersütun çıktı verir. Varsayılan değer130şeklindedir.-tbelirtilmediği sürecediffikinci sütunu her zaman bir sekme durağına hizalar; bu nedenle--widthiçin--tabsizedeğerinin yaklaşık beş katından küçük değerler şaşırtıcı sonuçlar doğurabilir.--changed-group-format GFMT: Girdi gruplarını sağlanan biçimde biçimlendirir.--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 davranış budur.--normal: Varsayılan diff çıktısını kullanır.--speed-large-files: GNUdiffile uyumluluk için sağlanan geçici seçenektir.--strip-trailing-cr: Girdi dosyaları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ını belirtir. Varsayılan değer8şeklindedir.
--changed-group-format için biçim dizesi özel anahtar kelimeler içerebilir:
%<:FILE1içinden gelen satırlar.%>:FILE2içinden gelen satırlar.
Algoritmalar
myers: Myers diff algoritması, bir girdiyi diğerine dönüştüren en kısa düzenlemeyi bulur. GenellikleO(N+D²)sürede çalışır veO(N)alan gerektirir; buradaNgirdilerin uzunluklarının toplamı,Dise aralarındaki farkın uzunluğudur. Teorik en kötü durumO(N·D)şeklindedir. En kötü durum girdisiyle karşılaşılırsa,difftarafından kullanılan uygulama daha az optimal ancak daha hızlı bir algoritmaya geri döner.patience: Myers algoritmasının Patience varyantıdır. Satırları mantıksal olarak gruplandırarak estetik açıdan daha hoş diff çıktısı üretmeye ç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. Uzun ortak alt diziler olduğunda en kötü durum performansıyla karşılaşır; büyük dosyalarda bu ö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 olur. Aksi halde diff 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.
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ızcadir2içinde bulunursa,dir1içinde de bulunuyormuş ancak boyutu sıfırmış gibi davranır.-r,--recursive: Karşılaşılan ortak alt dizinlerediffaracının özyinelemeli olarak uygulanmasına neden olur.-S name,--starting-file name: Bir dizin diff'ini ortasından,namedosyasından başlayarak yeniden başlatır.-s,--report-identical-files: Normalde bahsedilmeyen aynı dosyalarındifftarafından rapor edilmesine neden olur.-X file,--exclude-from file: Dosya adı tabanlarıfileiçindeki satırlarla eşleşen dosyaları ve alt dizinleri karşılaştırmanın dışında tutar. Birden fazla-Xseçeneği belirtilebilir.-x pattern,--exclude pattern: Dosya adı tabanlarıpatternile eşleşen dosyaları ve alt dizinleri karşılaştırmanın dışında tutar. Örüntülerfnmatch(3)aracılığıyla kabuk tarzı eşleştirme kullanılarak eşleştirilir. Birden fazla-xseçeneği belirtilebilir.
Her iki argüman da dizinse, diff dizinlerin içeriklerini ada göre sıralar ve ardından farklı olan metin dosyaları üzerinde normal dosya diff algoritmasını çalıştırarak değişiklik listesi üretir. 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 değerlerinden yalnızca biri dizinse, diff normal olmayan dosyaya ve dizin içinde normal olmayan dosyanın son bileşeniyle aynı ada sahip dosyaya uygulanır.
Çıktı Stili
Varsayılan, yoğun veya -e, -c ya da -n --rcs seçenekleri olmadan üretilen çıktı, XX, YY, ZZ, QQ dosya sırasına göre satır numaraları olmak üzere şu biçimlerde satırlar içerir:
XXaYY: Bunları eşit kılmak içinfile1dosyasınınXXsatırının sonunafile2dosyasınınYYsatırının içeriğini ekleyin.XXaYY,ZZ: Yukarıdakiyle aynıdır, ancakfile2dosyasınınYYsatırındanZZsatırına kadar olan aralığıfile1dosyasınınXXsatırına ekleyin.XXdYY:XXsatırındaki satırı silin.YY, değişikliğinfile1dosyasınıfile2ile uyumlu hale getirmek için hangi satıra getireceğini gösterir.XX,YYdZZ:file1içindekiXXsatırındanYYsatırına kadar olan aralığı silin.XXcYY:file1içindekiXXsatırınıfile2içindekiYYsatırıyla değiştirin.XX,YYcZZ: Belirtilen satır aralığınıZZsatırıyla değiştirin.XX,YYcZZ,QQ:file1içindekiXX,YYaralığınıfile2içindekiZZ,QQaralığıyla değiştirin.
Bu satırlar, file1 dosyasını file2 dosyasına dönüştürmek için ed(1) alt komutlarına benzer. Eylem harflerinden önceki satır numaraları file1, sonrakiler ise file2 ile ilgilidir.
Bu nedenle a harfini d ile değiştirerek ve satırı ters sırada okuyarak file2 dosyasının file1 dosyasına nasıl dönüştürüleceği de belirlenebilir. ed(1) içinde olduğu gibi, aynı çiftler (num1 = num2 olduğunda) tek sayı olarak kısaltılır.
Ortam
DIFFCOLORS: Değeriadd:rmbiçimindedir;addeklemeler için ASCII kaçış dizisi,rmise silmeler için ASCII kaçış dizisidir. Ayarlanmamışsadiff, eklemeler için yeşili ve 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, dizin listesinde görünmez.
Çıkış Durumu
diff 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 diff oluşturmak ve yalnızca bu dizinlerden birinde bulunan dosyaları yeni dosya olarak değerlendirmek:
diff -ruN /path/to/old_dir /path/to/new_dir
Yukarıdakiyle aynı işlemi yaparken *.h ve *.c ifadeleriyle eşleşen dosyaları hariç tutmak:
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ülemek:
diff -q /boot/loader.conf /boot/defaults/loader.conf
Örnek çıktı:
Files /boot/loader.conf and /boot/defaults/loader.conf differ
Aşağıdaki içeriğe sahip example.txt adlı bir dosya olduğunu varsayalım:
FreeBSD is an operating system
Linux is a kernel
OpenBSD is an operating system
Standart girdiyi example.txt ile karşılaştırmak ve Linux veya Open içeren satırları karşılaştırmanın dışında tutmak:
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, IEEE Std 1003.1-2008 ("POSIX.1") belirtimiyle uyumludur.
[-AaDdIiLlNnPpqSsTtwXxy] bayrakları bu belirtimin uzantılarıdır.
Tarihçe
Sürüm 6 AT&T UNIX'te bir diff komutu ortaya çıkmıştır. 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 uygulamayla değiştirildi. Süreçte bazı GNU özellikleri 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.