ฉันจะได้สิ่งที่ตรงข้ามกับ `diff -q '- จับคู่ไฟล์ที่เหมือนกันโดยไม่ต้องพิมพ์เนื้อหา


13

ฉันมีไฟล์จำนวนมากในไดเรกทอรีและฉันต้องการตรวจสอบว่าพวกเขาทั้งหมดไม่ซ้ำกัน สำหรับความเรียบง่ายสมมติว่าผมมีสามไฟล์: foo.txt, และbar.txt baz.txtหากฉันใช้วงนี้ฉันจะตรวจสอบพวกเขาทั้งหมดต่อกัน:

$ for f in ./*; do for i in ./*; do diff -q "$f" "$i"; done; done
Files bar.txt and baz.txt differ
Files bar.txt and foo.txt differ
Files baz.txt and bar.txt differ
Files baz.txt and foo.txt differ
Files foo.txt and bar.txt differ
Files foo.txt and baz.txt differ

สำหรับไฟล์หลายร้อยไฟล์ที่ฉันต้องการจัดการมันจะไม่สามารถอ่านได้ มันจะดีกว่าที่จะแสดงรายการไฟล์ที่ทำการแข่งขันและจากนั้นผมสามารถมองผ่านรายการได้อย่างรวดเร็วและตรวจสอบให้แน่ใจว่าไฟล์ที่เป็นเพียงที่ตรงกับตัวเอง จาก manpage ฉันจะคิดว่า-sตัวเลือกจะสำเร็จ:

$ for f in ./*; do for i in ./*; do diff -s "$f" "$i"; done; done
Files bar.txt and bar.txt are identical
Files baz.txt and baz.txt are identical
Files foo.txt and foo.txt are identical

... อย่างไรก็ตามในความเป็นจริงมันยังพิมพ์เนื้อหาทั้งหมดของไฟล์ใด ๆ ที่แตกต่างกัน มีวิธีใดที่จะระงับพฤติกรรมนี้ดังนั้นฉันจะได้รับพฤติกรรมดังกล่าวข้างต้นเท่านั้นหรือไม่

อีกวิธีหนึ่งมีเครื่องมืออื่น ๆ ที่สามารถทำได้หรือไม่

คำตอบ:


6

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

for f in ./*; do for i in ./*; do cmp -s "$f" "$i" && echo "Files $f and $i are identical"; done; done

diff พยายามสร้างรายการความแตกต่างสั้น ๆ ที่มนุษย์อ่านได้และอาจใช้เวลาค่อนข้างนานดังนั้นหลีกเลี่ยงค่าใช้จ่ายหากคุณไม่ต้องการ


12

สิ่งนี้ควรทำเคล็ดลับ:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$'

ที่ไหนdir1และdir2เป็นสองไดเรกทอรีของคุณ

หากคุณต้องการพิมพ์เฉพาะไดเรกทอรีที่ตรงกันจากdir1:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $2}'

และเช่นเดียวกันหากคุณต้องการพิมพ์เฉพาะไดเรกทอรีที่ตรงกันจากdir2:

diff -rs dir1 dir2 | egrep '^Files .+ and .+ are identical$' | awk -F '(Files | and | are identical)' '{print $3}'

นี่คือสิ่งที่ฉันกำลังมองหาขอบคุณ!
Joshua Soileau

ใช้diff -qrsเมื่อเปรียบเทียบไฟล์ขนาดใหญ่ (ระงับการพิมพ์ที่แตกต่างอย่างเงียบ ๆ )
marcovtwout

4

เร็วที่สุดเครื่องมือที่เขียนขึ้นสำหรับวัตถุประสงค์ที่เป็นfdupes (มันมีอยู่ในแพคเกจของ Repos Fedora และ Ubuntu และ ... )

การใช้งาน:

fdupes -r dir1 dir2

2

หากคุณต้องการค้นหาไฟล์ที่เหมือนกันในรายการก่อนอื่นให้เรียงไฟล์ตามขนาดเช่น

ls -S

จากนั้นสำหรับแต่ละไฟล์ที่มีขนาดเท่ากันให้เรียกใช้md5sumเพื่อดูได้ง่ายว่าไฟล์ใดที่เหมือนกัน

สำหรับไฟล์ขนาดใหญ่อาจจะเร็วกว่าการตรวจสอบครั้งแรกเพียงส่วนสั้น ๆ ของไฟล์ทั้งหมด:

dd if=file bs=512 count=1 | md5sum

จากนั้นทำการตรวจสอบเต็มรูปแบบเฉพาะในไฟล์ที่น่าสงสัย

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