Cara membandingkan fail menggunakan diff

Cara membandingkan fail menggunakan diff

Utiliti diff adalah, dalam kebanyakan kes, dipasang secara lalai dalam setiap pengedaran Linux di luar sana. Program ini digunakan untuk mengira dan memaparkan perbezaan antara kandungan dua fail. Ia digunakan terutamanya semasa bekerja dengan kod sumber dua membandingkan versi yang sama dari dua fail dan menyerlahkan perbezaan di antara mereka. Dalam artikel ini kita akan mempelajari pelbagai mod di mana diff dapat berfungsi dan bagaimana membuat fail diff yang kemudiannya boleh digunakan sebagai patch dengan utiliti patch.

Dalam tutorial ini anda akan belajar:

  • Cara Menggunakan Diff
  • Cara memaparkan output diff pada dua lajur semasa menggunakan diff dalam mod biasa
  • Cara membaca output diff dalam mod normal, konteks dan bersatu
  • Cara membuat fail diff dan memohonnya sebagai patch dengan utiliti patch
Cara membandingkan fail menggunakan diff

Keperluan perisian dan konvensyen yang digunakan

Keperluan Perisian dan Konvensyen Talian Perintah Linux
Kategori Keperluan, konvensyen atau versi perisian yang digunakan
Sistem Pengedaran bebas
Perisian diff, patch
Yang lain Tiada
Konvensyen # - Memerlukan komando linux yang diberikan untuk dilaksanakan dengan keistimewaan akar sama ada secara langsung sebagai pengguna root atau dengan menggunakan sudo perintah
$-memerlukan komando Linux yang diberikan sebagai pengguna yang tidak berkadar biasa

Utiliti diff

The berbeza Utiliti membandingkan fail mengikut baris; Sintaksinya sangat mudah:

$ diff [opsyen] fail 

Yang harus kita lakukan ialah menggunakan program yang diikuti dengan jalan fail yang kita mahu bandingkan. Sebelum kita dapat melihat beberapa contoh penggunaan, kita perlu belajar membaca output utiliti, dan apakah maksud simbol -simbol yang digunakan dalam output yang dihasilkan olehnya. Kita boleh meringkaskannya dalam jadual berikut:

Simbol Makna
a "Penambahan" diperlukan agar kandungan kedua -dua fail tersebut dipadankan
c Tindakan "perubahan" diperlukan agar kandungan kedua -dua fail tersebut dipadankan
d Tindakan "padam" diperlukan agar kandungan kedua -dua fail tersebut sesuai
< Menunjukkan garis dari fail pertama
> Menunjukkan garis dari fail kedua


Sekarang kita dapat melihat beberapa contoh penggunaan diff asas. Katakan kami mempunyai dua fail, yang dipanggil LOTR0.txt dan LOTR1.txt. Kandungan fail pertama adalah seperti berikut:

Tiga cincin untuk elven-raja di bawah langit, tujuh untuk kerdil-dewan di dewan batu mereka, sembilan untuk lelaki fana ditakdirkan mati, satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang-bayang berbaring. Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayang -bayang terletak # akhir 

Anda pasti mengenali puisi "cincin" dari buku "Lord of the Rings". Sekarang anggap fail kedua, LOTR1.txt, Mengandungi baris berikut sebaliknya:

# Puisi cincin dalam ucapan hitam Mordor tiga cincin untuk raja-raja elven di bawah langit, tujuh untuk kerdil-dewan di dewan mereka, sembilan untuk lelaki fana yang ditakdirkan mati, satu untuk Tuhan yang gelap di atas takhta gelapnya Di tanah Mordor di mana bayang -bayang berbohong. Ash Nazg Durbatulûk, Ash Nazg Gimbatul, Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, di tanah Mordor di mana bayang-bayang terletak 

Kandungan kedua -dua fail itu hampir sama, tetapi tidak sama. Mari jalankan berbeza utiliti pada mereka, dan lihat apa output yang dihasilkan:

$ diff lotr0.TXT LOTR1.txt 0a1> # puisi cincin dalam ucapan hitam Mordor 6,7c7,8 < One Ring to rule them all, One Ring to find them,  Ash nazg durbatulûk, ash nazg gimbatul, > Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, 9d9 < # end 

Pada baris pertama output, kita boleh membaca 0A1; Apakah maksud ini? Dalam kes ini, kami diberitahu bahawa untuk fail pertama untuk memadankan kandungan kedua, pada permulaannya (baris 0), barisan baru harus "ditambah" (a), yang sepadan dengan baris pertama (1) dari fail kedua. Apa itu garis ini? Yang dilaporkan selepas > simbol pada baris kedua output:

> # Puisi cincin dalam ucapan hitam Mordor 

Ini masuk akal: baris tidak wujud dalam fail pertama, jadi ia harus ditambah untuk kandungan kedua -dua fail untuk dipadankan.

Jom sambung. Kita dapat melihat notasi berikut 6,7C7,8: ini bermaksud garis 6 ke 7 dalam fail pertama (6,7) harus diubah untuk memadankan garis 7 ke 8 (7,8) int fail kedua. Bagaimana mereka harus diubah? Garis dari fail pertama, yang dapat kita bezakan kerana didahului oleh < simbol, adalah:

< One Ring to rule them all, One Ring to find them, < One Ring to bring them all, and in the darkness bind them, 

Mereka harus ditukar kepada baris berikut fail kedua, yang dapat dilihat kerana mereka didahului oleh > simbol dalam output diff:

> Ash Nazg Durbatulûk, Ash Nazg Gimbatul,> Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, 

Garis dari fail pertama, dan garis dari yang kedua, dalam output, dipisahkan oleh tiga sengkang: (---).

Akhirnya, kami mempunyai 9d9 Notasi: Ini bermakna agar kandungan kedua -dua fail tersebut dipadankan, garis 9 dalam fail pertama (# end) harus dipadam untuk memadankan baris 9 dari fail kedua.

Memaparkan output bersebelahan

Dalam contoh -contoh di atas, kita dapat melihat bahawa output yang dihasilkan oleh utiliti diff dianjurkan "menegak". Sekiranya kita lebih suka, kita boleh membuat supaya ia diformat dan dipaparkan menggunakan dua lajur. Yang harus kita lakukan hanyalah menggunakan -y pilihan (pendek
untuk --sebelah menyebelah):

$ diff -y lotr0.TXT LOTR1.txt> # Puisi cincin dalam ucapan hitam Mordor tiga cincin untuk Elven-Kings di bawah langit, tiga cincin untuk Elven-Kings di bawah langit, tujuh untuk orang kerdil di dewan mereka, tujuh untuk kerdil -Bords di dewan batu mereka, sembilan untuk lelaki fana ditakdirkan untuk mati, sembilan untuk lelaki fana ditakdirkan untuk mati, satu untuk Tuhan yang gelap di atas takhta gelapnya untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang -bayang berbohong. Di tanah Mordor di mana bayang -bayang berbohong. Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, | Ash Nazg Durbatulûk, Ash Nazg Gimbatul, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, | Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, di tanah Mordor di mana bayang-bayang terletak di tanah Mordor di mana bayang-bayang berbaring # akhir < 

Kandungan fail pertama dipaparkan di lajur kiri, dan yang kedua, di sebelah kanan. Kita dapat dengan mudah melihat perbezaan di antara mereka: garis apa yang hanya wujud di salah satu daripada kedua -dua, dan garis apa yang berbeza. The -y pilihan hanya boleh digunakan semasa bekerja dengan diff dalam mod "normal", yang merupakan lalai. Mod lain wujud: kita bercakap tentang mereka di bahagian seterusnya.

Mod biasa, konteks dan bersatu

Secara lalai utiliti diff berfungsi di biasa mod, dan menghasilkan output yang serupa dengan yang kita lihat dalam contoh sebelumnya. Walau bagaimanapun, terdapat dua mod lain yang boleh kita gunakan: konteks dan bersatu mod. Mari kita lihat
pada mereka.

Mod konteks

Mod konteks boleh digunakan dengan menggunakan program dengan -c pilihan, (pendek untuk --konteks). Dalam kes kami, ia akan menghasilkan output berikut:

$ diff -c lotr0.TXT LOTR1.txt *** lotr0.TXT 2021-03-13 16:10:25.248286081 +0100 --- LOTR1.TXT 2021-03-13 15:30:54.060911632 +0100 *************** *** 1,9 **** Tiga cincin untuk Elven-Kings di bawah langit, tujuh untuk kerdil-dwarf di dewan batu mereka , Sembilan untuk lelaki fana ditakdirkan untuk mati, satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang -bayang berbaring. ! Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, ! Satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, di tanah Mordor di mana bayang The Elven-Kings Under the Sky, Tujuh untuk Dwarf-Lords di Dewan Batu mereka, Sembilan untuk Orang Fana yang ditakdirkan untuk mati, satu untuk Tuhan Gelap di atas takhta gelapnya di tanah Mordor di mana bayang-bayang berbaring. ! Ash Nazg Durbatulûk, Ash Nazg Gimbatul, ! Ash Nazg Thrakatulûk, Agh Burzum-ishi Krimpatul, di tanah Mordor di mana bayang-bayang berbohong 


Mari kita lihat hasil ini. Pertama sekali kita dapat melihat bahawa kedua -dua fail dirujuk dengan menggunakan simbol yang berbeza: *** untuk yang pertama, dan --- Untuk yang kedua.

Dua baris pertama memberikan maklumat mengenai kedua -dua fail tersebut. Kita dapat melihat:

  • Nama fail
  • Masa pengubahsuaian fail dengan zon waktu (+0100 dalam kes ini)

Dua baris pertama dipisahkan dari seluruh output sebanyak 15 asterisk (*******************).

Apa yang kita lihat sejurus selepas pemisah, adalah notasi yang menentukan apakah julat garis fail pertama yang dilaporkan dalam output, dalam hal ini baris 1 hingga 9 (1,9). Selepas notasi ini, garis itu sendiri dilaporkan. Perkara yang sama berlaku untuk fail kedua. Kita dapat melihat bahawa baris tertentu didahului oleh beberapa simbol; Mari lihat apa maksud mereka:

Simbol Makna
! Garis yang diawali dengan simbol ini dalam fail pertama perlu ditukar kepada garisan yang didahului olehnya dalam fail kedua, agar kandungan kedua -dua fail tersebut dipadankan
- Garis yang didahului oleh simbol ini dalam fail pertama, harus dipadamkan agar kandungan kedua -dua fail tersebut sesuai
+ Garis dalam fail kedua yang didahului oleh simbol ini harus ditambah ke fail pertama untuk kandungan kedua -dua fail untuk dipadankan

Mod bersatu

Untuk menggunakan berbeza utiliti dalam mod "bersatu", kita mesti memanggilnya dengan menggunakan -u pilihan, yang merupakan bentuk pendek dari --bersatu. Begitulah output diff dalam mod bersatu akan kelihatan dalam kes ini:

$ diff -u lotr0.TXT LOTR1.txt --- lotr0.TXT 2021-03-13 16:10:25.248286081 +0100 +++ lotr1.TXT 2021-03-13 15:30:54.060911632 +0100 @@ -1,9 +1,9 @@ +# Puisi cincin dalam ucapan hitam Mordor tiga cincin untuk Elven-Kings di bawah langit, tujuh untuk kerdil-dwarf di dewan mereka, sembilan Bagi lelaki fana yang ditakdirkan untuk mati, satu untuk Tuhan yang gelap di atas takhta gelapnya di tanah Mordor di mana bayang -bayang berbohong. -Satu cincin untuk memerintah mereka semua, satu cincin untuk mencari mereka, satu cincin untuk membawa mereka semua, dan dalam kegelapan mengikat mereka, +abu nazg durbatulûk, abu nazg gimbatul, +abu nazg thrakatu, agzum -ishi krimpatul, di Tanah Mordor di mana bayang -bayang berbaring -# akhir 

Dua baris pertama yang dihasilkan apabila diff dipanggil dengan -u pilihan, sama dengan mod "konteks", dan memaparkan maklumat mengenai kedua -dua fail tersebut. Satu -satunya perbezaan besar di sini adalah bahawa output tidak dipisahkan bergantung pada fail yang dimiliki: semua baris adalah "bersatu".

Membuat fail diff dan memohon sebagai patch

Katakan kami ingin menggunakan perubahan yang diperlukan pada kandungan fail pertama yang kami gunakan dalam contoh sebelumnya, LOTR0.txt, supaya ia dikemas kini untuk memadankan kandungan fail kedua, LOTR1.txt; Bagaimana kita akan meneruskan? Untuk mencapai matlamat kami, kami dapat menggunakannya patch utiliti dan memohon a fail diff kepada yang asal. A fail diff Mengandungi output diff, jadi untuk mencipta satu, yang perlu kita lakukan adalah untuk mengarahkan output utiliti:

$ diff -u lotr0.TXT LOTR1.txt> lotr.patch 


Sebaik sahaja kami mempunyai fail diff kami, kami boleh menggunakan perubahan yang diperlukan pada fail asal menggunakan utiliti patch:

$ patch -b lotr0.txt lotr.patch 

Kami memohon patch menggunakan -b Pilihan: Ini tidak wajib tetapi berguna kerana ia membuat supaya sandaran fail asal dibuat sebelum patch digunakan (dalam hal ini ia akan dinamakan LOTR0.txt.Orig). Hujah -hujah kita
disediakan adalah:

  • Nama fail asal di mana patch harus digunakan
  • Nama fail yang mengandungi patch.

Selepas patch digunakan LOTR0.txt fail mestilah sama dengan LOTR1.txt. Kami boleh mengesahkannya dengan menggunakan diff lagi, yang kali ini tidak menghasilkan output:

$ diff lotr0.TXT LOTR1.txt 

Kesimpulan

Dalam tutorial ini kita belajar cara menggunakan diff untuk mengira perbezaan antara dua fail. Kita melihat apakah mod di mana diff boleh digunakan dan apakah makna simbol yang digunakan dalam output diff. Akhirnya kita melihat cara membuat fail diff, dan cara menerapkannya sebagai patch menggunakan utiliti patch.

Tutorial Linux Berkaitan:

  • Pengenalan kepada Automasi, Alat dan Teknik Linux
  • Menguasai Gelung Skrip Bash
  • Perkara yang hendak dipasang di Ubuntu 20.04
  • Mint 20: Lebih baik daripada Ubuntu dan Microsoft Windows?
  • Tutorial Debugging GDB untuk Pemula
  • Cara Membangun semula Pakej Menggunakan Sistem Membina Linux Arch
  • Gelung bersarang dalam skrip bash
  • Cara Gunung ISO di Linux
  • Sistem Hung Linux? Cara melarikan diri ke baris arahan dan ..
  • Perkara yang perlu dilakukan setelah memasang ubuntu 20.04 Focal Fossa Linux