ไฟล์ Diff มีอยู่ในสองไดเรกทอรีที่ต่างกัน


303

ฉันมีสองไดเรกทอรีที่มีรายการไฟล์เหมือนกัน ฉันต้องการเปรียบเทียบไฟล์ทั้งหมดที่มีอยู่ในทั้งสองไดเรกทอรีโดยใช้diffคำสั่ง มีตัวเลือกบรรทัดคำสั่งง่าย ๆ ให้ทำหรือฉันต้องเขียนเชลล์สคริปต์เพื่อรับรายชื่อไฟล์จากนั้นทำซ้ำผ่านพวกเขา?

คำตอบ:


422

คุณสามารถใช้diffคำสั่งเพื่อ:

diff -bur folder1/ folder2/

สิ่งนี้จะเอาท์พุท diff แบบเรียกซ้ำที่ละเว้นช่องว่างโดยมีบริบทรวม:

  • ธงbหมายถึงการละเว้นช่องว่าง
  • แฟล็ก uหมายถึงบริบทรวม (3 บรรทัดก่อนและหลัง)
  • ธงrหมายถึงการเรียกซ้ำ

9
คุณสามารถมีการเข้าถึงdiffคำสั่งโดยการดาวน์โหลดสาธารณูปโภค GNU สำหรับ Win32
Laurent Etiemble

7
ฉันได้พบว่า - ตัวเลือกสั้น ๆ มีประโยชน์; คุณได้รับรายการของไฟล์ที่ถูกเปลี่ยนแปลงและสามารถประมวลผลแยกกันได้
Dariusz

27
สำหรับผู้อื่นที่สงสัยให้-bละเว้นการเปลี่ยนแปลงของ whitespace และ-uให้บัฟเฟอร์ 3 บรรทัด
rattray

28
ง่ายต่อการจำคำสั่งนี้ถ้าคุณใช้ rub แทน bur เช่นdiff -rub folder1/ folder2/
SomeGuyOnAComputer

11
ฉันนึกภาพออก-burจะจำง่ายถ้าคุณอาศัยอยู่ในสภาพอากาศที่หนาวเย็น
AlanH

126

หากคุณสนใจที่จะเห็นไฟล์ที่แตกต่างกันคุณสามารถใช้:

diff -qr dir_one dir_two | sort

ตัวเลือก "q" จะแสดงเฉพาะไฟล์ที่แตกต่างกัน แต่ไม่มีเนื้อหาที่แตกต่างกันและ "เรียงลำดับ" จะจัดเรียงเอาต์พุตตามตัวอักษร


1
มันเยี่ยมมาก! ทำงานได้อย่างมีประสิทธิภาพเช่นในกรณีที่ไดเรกทอรีย่อยทั้งหมดมีอยู่ในไดเรกทอรีใดไดเรกทอรีหนึ่งจะหยุดการเกิดซ้ำและรายงานเฉพาะไดเรกทอรีย่อยเอง (โดยไม่มีเนื้อหาที่สืบทอด) ดีมาก!!
SomethingSomething

นี้เป็นขั้นตอนแรกที่ดีจริงๆ: ดูสิ่งที่ถ้ามีอะไรไม่แตกต่างกันและจากนั้นทำรายละเอียดdiffเกี่ยวกับคู่ของไฟล์ที่แตกต่างกันในแต่ละ วิธีการหนึ่งจะแตกต่างกันอย่างมากหากไฟล์หนึ่งหรือสองไฟล์แตกต่างกันเมื่อเทียบกับไฟล์หลายสิบไฟล์ ฉันอาจหลงทางในผลลัพธ์จากการdiffโหลดหลายสิบไฟล์ในครั้งเดียว!
jvriesem

นอกจากนี้ยังสามารถรวม-x PATTERNไว้ในคำสั่งเพื่อแยกไดเรกทอรีย่อยบางอย่าง ตัวอย่างเช่นdiff -qr repo1 repo2 -x ".git"จะเปรียบเทียบสองไดเรกทอรี (repo1 และ repo2) แต่จะยกเว้นไฟล์ในโฟลเดอร์. git ของไดเรกทอรีที่เกี่ยวข้อง
ViFI


11

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

$ man diff

...

-r  --recursive
        Recursively compare any subdirectories found.

...

3

หาก GNU แตกต่างกันคุณควรจะสามารถชี้ไปที่ไดเรกทอรีทั้งสองและใช้ตัวเลือก -r

มิฉะนั้นลองใช้

for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done

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

นอกจากนี้ฉันลืมที่จะเพิ่มว่าฉันทำ '\ ls' เพื่อปิดการใช้งานนามแฝงของฉันไปยัง GNU ชั่วคราวเพื่อให้ฉันสูญเสียข้อมูลการจัดรูปแบบสีจากรายชื่อที่ส่งคืนโดย GNU



1
@Dennis ทางลัดขี้ขลาด +1 ฉันคุ้นเคยกับการทำการแทนที่คำสั่งแม้ว่าจะเป็นแบบอัตโนมัติและฉันก็แค่ใช้คำสั่งที่ฉันต้องการเช่นบางครั้งฉันก็ใช้ find การใช้ ls ยังช่วยให้ฉันเล่นกับรายชื่อ dir เพิ่มเติมเช่นย้อนเวลาตามแทนที่จะเป็นลำดับเริ่มต้น
Rob Wells

0

นี่คือสคริปต์เพื่อแสดงความแตกต่างระหว่างไฟล์ในสองโฟลเดอร์ มันทำงานซ้ำ เปลี่ยน dir1 และ dir2

(search() { for i in $1/*; do [ -f "$i" ] && (diff "$1/${i##*/}" "$2/${i##*/}" || echo "files: $1/${i##*/}   $2/${i##*/}"); [ -d "$i" ] && search "$1/${i##*/}" "$2/${i##*/}"; done }; search "dir1" "dir2" )

0

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

diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'

-printf '%P\n'บอกfindให้ไม่นำหน้าเอาต์พุตพา ธ ด้วยไดเร็กทอรี root

ฉันได้เพิ่มนอกจากนี้ยังเพื่อให้แน่ใจว่าคำสั่งของไฟล์ที่จะเหมือนกันทั้งในสายของsortfind

grepที่สิ้นสุดเอาข้อมูลเกี่ยวกับเส้นที่นำเข้าเหมือนกัน


-4

ลองสิ่งนี้:

diff -rq /path/to/folder1 /path/to/folder2      

2
เป็นการทำซ้ำคำตอบที่มีอยู่และไม่เพิ่มเนื้อหาใหม่ โปรดอย่าโพสต์คำตอบเว้นแต่ว่าคุณมีสิ่งใหม่ที่จะมีส่วนร่วม
Toby Speight
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.