Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

Linux diff – วิธีแสดงความแตกต่างและสร้างแพตช์ พร้อมตัวอย่าง

ความแตกต่าง คำสั่งเป็นวิธีที่ง่ายในการเปรียบเทียบไฟล์หรือไดเร็กทอรีจากเชลล์ Linux บทความนี้จะแสดงวิธีใช้งาน พร้อมตัวอย่างการใช้งานทั่วไปบางส่วน

ความ ความแตกต่าง คำสั่งทำการเปรียบเทียบไฟล์หรือไดเร็กทอรีสองไฟล์แบบบรรทัดต่อบรรทัด และแสดงความแตกต่างระหว่างไฟล์ทั้งสอง

ทำไมคุณถึงต้องการเปรียบเทียบไฟล์หรือไดเร็กทอรี

  • คุณอาจมีไฟล์สองไฟล์ที่มีชื่อเหมือนกันซึ่งมีลักษณะคล้ายกันและต้องการเห็นความแตกต่างระหว่างไฟล์ทั้งสอง
  • เปรียบเทียบการเปลี่ยนแปลงกับโค้ดการเขียนโปรแกรมในโครงการที่คุณกำลังสร้างระหว่างเวอร์ชันใหม่และเวอร์ชันเก่า
  • คุณได้คัดลอกไฟล์จำนวนมากไปยังไดรฟ์อื่นและต้องการให้แน่ใจว่าทุกอย่างได้รับการคัดลอกเรียบร้อยแล้วและไม่มีความเสียหาย
  • คุณและเพื่อนต่างก็มีไฟล์ชุดเดียวกันในโฟลเดอร์ คุณได้ทำการเปลี่ยนแปลงของคุณแล้ว แต่ไม่ต้องการส่งทั้งหมดไปให้เพื่อนของคุณอีก คุณสามารถใช้ diff เพื่อสร้างแพตช์ที่มีเฉพาะการเปลี่ยนแปลงที่ทำกับไฟล์เหล่านั้น ให้ส่งไปให้พวกเขา จากนั้นอัปเดตสำเนาโดยไม่ต้องดาวน์โหลดใหม่ทั้งหมด

คุณอาจจะมีเหตุผลของคุณเองสำหรับการเปรียบเทียบไฟล์ ดังนั้นไปที่ diff และวิธีใช้

แตกต่าง ไวยากรณ์

diff OPTIONS FILES

โปรดทราบว่า:

  • OPTIONS คือ ไม่บังคับ และสามารถจัดหาได้จากตารางด้านล่าง
  • ไฟล์ เป็นพาธไปยังไฟล์สองไฟล์ที่จะเปรียบเทียบ คั่นด้วยช่องว่าง

แตกต่าง ตัวเลือก

ต่อไปนี้คือ ตัวเลือก . ที่ใช้บ่อยที่สุด สำหรับ ส่วนต่าง คำสั่งตรงจากคู่มือผู้ใช้:

-q, –brief รายงานเฉพาะเมื่อไฟล์ต่างกัน
-s, –report-identical-files รายงานเมื่อสองไฟล์เหมือนกัน
-u, -U NUM, –unified[=NUM] เอาต์พุต NUM (ค่าเริ่มต้น 3) บรรทัดของบริบทแบบรวม
-N –new-file ถือว่าไฟล์ที่หายไปเป็นไฟล์ว่าง
-l, –paginate ส่งเอาต์พุตผ่าน 'pr' เพื่อใส่เลขหน้า
-r, –recursive เปรียบเทียบไดเรกทอรีย่อยที่พบซ้ำๆ
–ไม่อ้างอิง อย่าติดตามลิงก์สัญลักษณ์
-a, –text ถือว่าไฟล์ทั้งหมดเป็นข้อความ
-d, –น้อยที่สุด พยายามอย่างหนักเพื่อค้นหาการเปลี่ยนแปลงเล็กๆ น้อยๆ
–speed-large-files สมมติว่าไฟล์ขนาดใหญ่และการเปลี่ยนแปลงเล็กๆ น้อยๆ มากมาย

ดูคู่มือฉบับเต็มได้ที่นี่หรือเรียกใช้:

man diff

…จากบรรทัดคำสั่งเพื่อดูชุดตัวเลือกทั้งหมด

ตัวอย่าง

การเปรียบเทียบไฟล์กับ diff ใน Linux

นี่คือการใช้งาน diff . ที่ง่ายที่สุด คำสั่งและจะส่งออกความแตกต่างระหว่างสองไฟล์ที่ให้มาไปยังคอนโซล:

diff file1.txt file2.txt

การเปลี่ยนเส้นทางเอาต์พุต

หากคุณเพียงแค่ต้องการดูความแตกต่างแทนที่จะสร้างแพตช์ การเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์นั้นมีประโยชน์ – เพื่อให้เทอร์มินัลไม่ตัดการเปลี่ยนแปลงใด ๆ หากมีจำนวนมาก:

diff -q file1.txt file2.txt > differences.txt

สิ่งนี้จะสร้าง (หรือเขียนทับ!differences.txt, ซึ่งจะสรุปความแตกต่างระหว่างทั้งสองไฟล์

ตัว -q มีการเพิ่มตัวเลือกเพื่อให้แสดงเฉพาะความแตกต่างเท่านั้น ไฟล์ที่เหมือนกันจะไม่ถูกกล่าวถึงเพื่อให้เห็นได้ง่ายขึ้นว่าเกิดอะไรขึ้น

การเปรียบเทียบไดเร็กทอรีกับ diff

ไดเรกทอรียังสามารถเปรียบเทียบได้โดยใช้ -r (เรียกซ้ำ) ตัวเลือกเพื่อเปรียบเทียบเนื้อหา:

diff -r -q /path/to/dir1 /path/to/dir2

อีกครั้ง ฉันใช้ -q ตัวเลือกที่นี่เพื่อให้แสดงเฉพาะความแตกต่างเท่านั้น

การเปรียบเทียบไฟล์ขนาดใหญ่หรือไดเร็กทอรีที่มีไฟล์ขนาดใหญ่

แตกต่าง เป็นกระบวนการที่เข้มข้น – ทุกไฟล์ที่เปรียบเทียบจะต้องอ่านและเปรียบเทียบ อาจใช้เวลาสักครู่

ไฟล์ –speed-large-files ตัวเลือกเปลี่ยน ส่วนต่าง อัลกอริธึมเพื่อให้มีประสิทธิภาพมากขึ้นหากคุณกำลังเปรียบเทียบไฟล์ขนาดใหญ่ – เร่งความเร็วขึ้นเล็กน้อย

การสร้างแพตช์สำหรับไฟล์

เพื่อสร้าง แพทช์ – รายการข้อแตกต่างระหว่างสองไฟล์ที่สามารถนำไปใช้กับสำเนาอื่นของไฟล์แรกเพื่อให้เหมือนกับไฟล์ที่สอง สามารถใช้คำสั่งต่อไปนี้:

diff -u file1.txt file2.txt > update.patch

ที่ -u ตัวเลือกแสดงความแตกต่างใน รวม รูปแบบที่ แพทช์ . ใช้ได้ คำสั่งให้อัพเดทไฟล์ต้นฉบับที่มีการเปลี่ยนแปลง

สิ่งนี้มีประโยชน์หากคุณมีเพื่อนหรือเพื่อนร่วมงานที่กำลังใช้ข้อมูลหรือโค้ดโปรแกรมของคุณอยู่ และคุณต้องการส่งการอัปเดตที่คุณทำไว้โดยไม่ต้องส่งทั้งชุดข้อมูลหรือแอปพลิเคชันอีกครั้ง

การติดตั้งโปรแกรมแก้ไขสำหรับไฟล์

เมื่อเพื่อนของคุณได้รับแพตช์ พวกเขาสามารถนำไปใช้ได้โดยใช้ แพทช์ . ต่อไปนี้ คำสั่ง:

patch original.txt < update.patch

การเลิกทำโปรแกรมแก้ไขสำหรับไฟล์

หากคุณทำผิดพลาด คุณสามารถเลิกทำแพตช์ได้ด้วยการเรียกใช้โปรแกรมแก้ไขย้อนกลับด้วยปุ่ม -R ตัวเลือก:

patch -R original.txt < update.patch

การสร้างแพตช์สำหรับไดเร็กทอรี

คำสั่งต่อไปนี้จะสร้างโปรแกรมแก้ไขสำหรับไดเรกทอรีทั้งหมดโดยเรียกใช้ -r (เรียกซ้ำ), -u (รูปแบบรวม) และ -N (ถือว่าไฟล์ที่หายไปเป็นไฟล์ว่าง)

diff -ruN originalDir updatedDir > update.patch

การติดตั้งโปรแกรมแก้ไขสำหรับไดเรกทอรี

สามารถใช้โปรแกรมแก้ไขกับไดเรกทอรีได้โดยใช้ปุ่ม -p0 ซึ่งจะใช้โปรแกรมแก้ไขกับโครงสร้างไดเร็กทอรีเดียวกันกับที่สร้างขึ้นใน:

patch -p0 < update.patch

การเลิกทำโปรแกรมแก้ไขสำหรับไดเรกทอรี

สุดท้าย เลิกทำ/ย้อนกลับการแพตช์ของไดเร็กทอรี:

patch -R -p0 originalFile < patchFile