man/text
man · Metin İşleme

$ diff

Bölüm 1 · Metin İşleme

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

Ö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: -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. Çı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. file1 içinden kaldırılan satırlar - ile, file2 iç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ıda file1 ve file2 dosyalarının birleştirilmiş bir sürümünü oluşturur. Çıktıya C önişlemci denetimleri eklenir; sonuç string tanımlanmadan derlenirse file1, string tanımlanarak derlenirse file2 elde edilir.
  • -e, --ed: ed(1) için girdi olarak uygun bir çıktı üretir. Bu çıktı daha sonra file1 dosyasını file2 dosyasına dönüştürmek için kullanılabilir.
  • -f, --forward-ed: -e bayrağı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 ve 0 durumuyla çı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, rcsdiff tarafı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: -u seçeneğine benzer, ancak number satı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, -c seç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 ve 0 durumuyla çı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ğerler myers, patience ve stone şeklindedir.
  • -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çenek, diff aracı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ı veya DIFFCOLORS ortam değişkenindeki değerle renklendirir. when için olası değerler never, always ve auto şeklindedir. auto, çıktı bir tty ise ve COLORTERM ortam 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: -p seç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 ifade pattern 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 örüntüyle eşleşmesi gerekir. Düzenli ifadeler hakkında daha fazla bilgi için re_format(7) sayfasına bakın.
  • -i, --ignore-case: Harflerin büyük/küçük durumunu yoksayar. Örneğin A ile a eşit karşılaştırılır.
  • -l, --paginate: Çıktıyı sayfalandırmak için pr(1) aracından geçirir.
  • -L label, --label label: Bağlam veya birleşik diff üstbilgisinde birinci dosya adı ve zamanı yerine label yazdı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: -b seçeneğine benzer, ancak boşluk ve sekme karakterlerini tamamen yoksayar. Örneğin if ( 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 fazla number sütun çıktı verir. Varsayılan değer 130 şeklindedir. -t belirtilmediği sürece diff ikinci sütunu her zaman bir sekme durağına hizalar; bu nedenle --width için --tabsize değ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: GNU diff ile 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ğer 8 şeklindedir.

--changed-group-format için biçim dizesi özel anahtar kelimeler içerebilir:

  • %<: FILE1 içinden gelen satırlar.
  • %>: FILE2 içinden gelen satırlar.

Algoritmalar

  • 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 en kötü durum O(N·D) şeklindedir. En kötü durum girdisiyle karşılaşılı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ı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ı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 aracının özyinelemeli 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: Normalde bahsedilmeyen aynı 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. Örüntüler 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 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çin file1 dosyasının XX satırının sonuna file2 dosyasının YY satırının içeriğini ekleyin.
  • XXaYY,ZZ: Yukarıdakiyle aynıdır, ancak file2 dosyasının YY satırından ZZ satırına kadar olan aralığı file1 dosyasının XX satırına ekleyin.
  • XXdYY: XX satırındaki satırı silin. YY, değişikliğin file1 dosyasını file2 ile uyumlu hale getirmek için hangi satıra getireceğini gösterir.
  • XX,YYdZZ: file1 içindeki XX satırından YY satırına kadar olan aralığı silin.
  • XXcYY: file1 içindeki XX satırını file2 içindeki YY satırıyla değiştirin.
  • XX,YYcZZ: Belirtilen satır aralığını ZZ satırıyla değiştirin.
  • XX,YYcZZ,QQ: file1 içindeki XX,YY aralığını file2 içindeki ZZ,QQ aralığı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ğeri add:rm biçimindedir; add eklemeler için ASCII kaçış dizisi, rm ise silmeler için ASCII kaçış dizisidir. Ayarlanmamışsa diff, 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.