ฉันมีสองไดเรกทอรีที่มีรายการไฟล์เหมือนกัน ฉันต้องการเปรียบเทียบไฟล์ทั้งหมดที่มีอยู่ในทั้งสองไดเรกทอรีโดยใช้diff
คำสั่ง มีตัวเลือกบรรทัดคำสั่งง่าย ๆ ให้ทำหรือฉันต้องเขียนเชลล์สคริปต์เพื่อรับรายชื่อไฟล์จากนั้นทำซ้ำผ่านพวกเขา?
ฉันมีสองไดเรกทอรีที่มีรายการไฟล์เหมือนกัน ฉันต้องการเปรียบเทียบไฟล์ทั้งหมดที่มีอยู่ในทั้งสองไดเรกทอรีโดยใช้diff
คำสั่ง มีตัวเลือกบรรทัดคำสั่งง่าย ๆ ให้ทำหรือฉันต้องเขียนเชลล์สคริปต์เพื่อรับรายชื่อไฟล์จากนั้นทำซ้ำผ่านพวกเขา?
คำตอบ:
คุณสามารถใช้diff
คำสั่งเพื่อ:
diff -bur folder1/ folder2/
สิ่งนี้จะเอาท์พุท diff แบบเรียกซ้ำที่ละเว้นช่องว่างโดยมีบริบทรวม:
-b
ละเว้นการเปลี่ยนแปลงของ whitespace และ-u
ให้บัฟเฟอร์ 3 บรรทัด
diff -rub folder1/ folder2/
-bur
จะจำง่ายถ้าคุณอาศัยอยู่ในสภาพอากาศที่หนาวเย็น
หากคุณสนใจที่จะเห็นไฟล์ที่แตกต่างกันคุณสามารถใช้:
diff -qr dir_one dir_two | sort
ตัวเลือก "q" จะแสดงเฉพาะไฟล์ที่แตกต่างกัน แต่ไม่มีเนื้อหาที่แตกต่างกันและ "เรียงลำดับ" จะจัดเรียงเอาต์พุตตามตัวอักษร
diff
เกี่ยวกับคู่ของไฟล์ที่แตกต่างกันในแต่ละ วิธีการหนึ่งจะแตกต่างกันอย่างมากหากไฟล์หนึ่งหรือสองไฟล์แตกต่างกันเมื่อเทียบกับไฟล์หลายสิบไฟล์ ฉันอาจหลงทางในผลลัพธ์จากการdiff
โหลดหลายสิบไฟล์ในครั้งเดียว!
-x PATTERN
ไว้ในคำสั่งเพื่อแยกไดเรกทอรีย่อยบางอย่าง ตัวอย่างเช่นdiff -qr repo1 repo2 -x ".git"
จะเปรียบเทียบสองไดเรกทอรี (repo1 และ repo2) แต่จะยกเว้นไฟล์ในโฟลเดอร์. git ของไดเรกทอรีที่เกี่ยวข้อง
Diff มีตัวเลือก-r
ที่ตั้งใจจะทำเช่นนั้น
diff -r dir1 dir2
diff
ไม่เพียง แต่สามารถเปรียบเทียบสองไฟล์ได้โดยใช้-r
ตัวเลือกเดินแผนผังไดเรกทอรีทั้งหมดตรวจสอบความแตกต่างระหว่างไดเรกทอรีย่อยและไฟล์ซ้ำที่เกิดขึ้นที่จุดเปรียบเทียบในแต่ละต้นไม้
$ man diff
...
-r --recursive
Recursively compare any subdirectories found.
...
หาก GNU แตกต่างกันคุณควรจะสามารถชี้ไปที่ไดเรกทอรีทั้งสองและใช้ตัวเลือก -r
มิฉะนั้นลองใช้
for i in $(\ls -d ./dir1/*); do diff ${i} dir2; done
NB ตามที่เดนนิสชี้ให้เห็นในส่วนความเห็นคุณไม่จำเป็นต้องทำการทดแทนคำสั่งบน ls ฉันทำสิ่งนี้มาเป็นเวลานานจนฉันทำแบบนี้กับ autopilot และแทนที่คำสั่งที่ฉันต้องการเพื่อรับรายการไฟล์ของฉันเพื่อทำการเปรียบเทียบ
นอกจากนี้ฉันลืมที่จะเพิ่มว่าฉันทำ '\ ls' เพื่อปิดการใช้งานนามแฝงของฉันไปยัง GNU ชั่วคราวเพื่อให้ฉันสูญเสียข้อมูลการจัดรูปแบบสีจากรายชื่อที่ส่งคืนโดย GNU
ls
:for i in ./dir1/*
นี่คือสคริปต์เพื่อแสดงความแตกต่างระหว่างไฟล์ในสองโฟลเดอร์ มันทำงานซ้ำ เปลี่ยน 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" )
หากคุณไม่ต้องการเปรียบเทียบเนื้อหาของไฟล์โดยเฉพาะและตรวจสอบว่าไม่มีไฟล์ใดในไดเรกทอรีทั้งสองคุณสามารถเปรียบเทียบรายการไฟล์ที่สร้างโดยคำสั่งอื่น
diff <(find DIR1 -printf '%P\n' | sort) <(find DIR2 -printf '%P\n' | sort) | grep '^[<>]'
-printf '%P\n'
บอกfind
ให้ไม่นำหน้าเอาต์พุตพา ธ ด้วยไดเร็กทอรี root
ฉันได้เพิ่มนอกจากนี้ยังเพื่อให้แน่ใจว่าคำสั่งของไฟล์ที่จะเหมือนกันทั้งในสายของsort
find
grep
ที่สิ้นสุดเอาข้อมูลเกี่ยวกับเส้นที่นำเข้าเหมือนกัน
ลองสิ่งนี้:
diff -rq /path/to/folder1 /path/to/folder2
diff
คำสั่งโดยการดาวน์โหลดสาธารณูปโภค GNU สำหรับ Win32