มีเครื่องมือ Linux diff ลึกที่เปรียบเทียบคุณสมบัติของไฟล์หรือไม่


17

มีเครื่องมือ Linux เช่น diff ที่จะเปรียบเทียบไฟล์และไดเรกทอรีซ้ำ แต่ด้วยนอกเหนือจากการเปรียบเทียบ: คุณลักษณะเพิ่มเติมของ acl, บริบทบริบท?


1
คำตอบที่ให้มาทำงานในการเปรียบเทียบเป็นครั้งคราว แต่ไม่เพียงพอสำหรับทำการเปรียบเทียบประเภทนี้หลายครั้งต่อชั่วโมงเมื่อทำการทดสอบซอฟต์แวร์ ฉันอาจจะอยากปรับเปลี่ยนซอร์สโค้ด diff เพื่อรวมการเปรียบเทียบเหล่านี้
Michael Gantz

คำตอบ:


7

ฉันทำสิ่งนี้ก่อนที่จะใช้การrsync -aHAX --deleteจดจำเพื่อเพิ่ม-nและตั้ง-iค่าสถานะ

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

สิ่งนี้จะดูทุกอย่างรวมถึง mtimes, date และอื่น ๆ รวมถึงไม่ได้ติดตามบนโหนดอุปกรณ์, ซ็อกเก็ต, ไพพ์ที่มีชื่อเป็นต้นบรรทัดคำสั่งด้านบนจะดู ACLs และแอตทริบิวต์เพิ่มเติมเช่นกัน คุณสามารถปรับสิ่งที่คุณกำลังมองหาโดยการเปลี่ยนตัวเลือกเป็นrsyncจำกัด อุปกรณ์หนึ่งด้วย-xเปลี่ยนพฤติกรรม soft & hard link ฯลฯ เป็นต้น


2

Janos ได้กล่าวแล้วว่าจะทำอย่างไร:

find /a -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >a
find /b -exec stat -c '%A %C %F %g %u %s %Y %n' {} \; >b

diff -u a b

และman 1 statพูดว่า:

%A     access rights in human readable form
%C     SELinux security context string
%F     file type
%g     group ID of owner
%u     user ID of owner
%s     total size, in bytes
%Y     time of last modification, seconds since Epoch
%n     file name

ในการเปรียบเทียบเนื้อหาไฟล์ที่คุณสามารถใช้:

find -type f -exec md5sum '{}' ';' | sort | uniq --all-repeated=separate -w 33 | cut -c 35-

as described here: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash

วิธีนี้ไม่ได้ให้วิธีแก้ปัญหาที่ใช้การได้ ส่วนต่างที่แสดงขึ้นมานั้นไม่มีบริบทและอ่านยากเกินไป ฉันกำลังมองหาบางอย่างที่สามารถแสดงชื่อไฟล์และสิ่งที่แตกต่างเกี่ยวกับมัน ไม่ต่างกับสองสิ่งที่ค้นพบซึ่งเป็นสัตว์ที่แตกต่างอย่างสิ้นเชิง
Michael Gantz

1
GNU findมีคุณสมบัติของ GNU statในตัว (และมีสถิติรุ่นก่อน GNU มาหลายทศวรรษ) คุณจะต้องเรียงลำดับผลลัพธ์ก่อนที่จะแตกต่างกัน และคุณต้องการ(cd /a && find . ...)มิฉะนั้นทุกบรรทัดจะแตกต่างกันเนื่องจาก/avs /bในพา ธ ของไฟล์
Stéphane Chazelas

0

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

cd a
export relpath=[path/to/b/from/a]

for filename in $(find .);
do
    echo $filename;
    diff <(xattr -l $filename) <(xattr -l $relpath/$filename);
done

การยืมจากคำตอบอื่นเราสามารถแก้ไขสิ่งนี้เพื่อใช้statแทนxattr:

for filename in $(find .);
do
    echo $filename;
    diff <(stat -c '%A %C %F %g %u %s %Y' $filename) <(stat -c '%A %C %F %g %u %s %Y' $relpath/$filename);
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.