มีเครื่องมือ Linux เช่น diff ที่จะเปรียบเทียบไฟล์และไดเรกทอรีซ้ำ แต่ด้วยนอกเหนือจากการเปรียบเทียบ: คุณลักษณะเพิ่มเติมของ acl, บริบทบริบท?
มีเครื่องมือ Linux เช่น diff ที่จะเปรียบเทียบไฟล์และไดเรกทอรีซ้ำ แต่ด้วยนอกเหนือจากการเปรียบเทียบ: คุณลักษณะเพิ่มเติมของ acl, บริบทบริบท?
คำตอบ:
ฉันทำสิ่งนี้ก่อนที่จะใช้การrsync -aHAX --delete
จดจำเพื่อเพิ่ม-n
และตั้ง-i
ค่าสถานะ
นี่เป็นสิ่งที่ขัดต่อความคิดสร้างสรรค์เล็กน้อย แต่อดทนกับฉัน rsync
คำสั่งหลักคือสิ่งที่คุณจะต้องซิงค์ทั้งสองไดเรกทอรีเข้าด้วยกัน แต่-n -i
ทำให้มันไม่ซิงค์ (เช่นทำแบบแห้ง) และพิมพ์สิ่งที่มันควรจะทำและทำไม การแยกวิเคราะห์มันไม่ได้ยอดเยี่ยม แต่คุณสามารถลบชื่อไฟล์ออกได้อย่างง่ายดายและไปป์ls
หรือใกล้เคียง
สิ่งนี้จะดูทุกอย่างรวมถึง mtimes, date และอื่น ๆ รวมถึงไม่ได้ติดตามบนโหนดอุปกรณ์, ซ็อกเก็ต, ไพพ์ที่มีชื่อเป็นต้นบรรทัดคำสั่งด้านบนจะดู ACLs และแอตทริบิวต์เพิ่มเติมเช่นกัน คุณสามารถปรับสิ่งที่คุณกำลังมองหาโดยการเปลี่ยนตัวเลือกเป็นrsync
จำกัด อุปกรณ์หนึ่งด้วย-x
เปลี่ยนพฤติกรรม soft & hard link ฯลฯ เป็นต้น
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
find
มีคุณสมบัติของ GNU stat
ในตัว (และมีสถิติรุ่นก่อน GNU มาหลายทศวรรษ) คุณจะต้องเรียงลำดับผลลัพธ์ก่อนที่จะแตกต่างกัน และคุณต้องการ(cd /a && find . ...)
มิฉะนั้นทุกบรรทัดจะแตกต่างกันเนื่องจาก/a
vs /b
ในพา ธ ของไฟล์
ต่อไปนี้เป็นสคริปต์ทุบตีด่วนที่ฉันเขียนเพื่อเปรียบเทียบคุณลักษณะเพิ่มเติม มันพิมพ์ออกมาทุกชื่อไฟล์แล้วความแตกต่างในคุณลักษณะ:
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