คุณจะเปรียบเทียบสองโฟลเดอร์และคัดลอกความแตกต่างไปยังโฟลเดอร์ที่สามได้อย่างไร


23

คุณมีสามโฟลเดอร์:

  • โฟลเดอร์ปัจจุบันซึ่งมีไฟล์ปัจจุบันของคุณ
  • โฟลเดอร์เก่าซึ่งมีไฟล์เดียวกันเวอร์ชันเก่ากว่า
  • ความแตกต่างของโฟลเดอร์ซึ่งเป็นเพียงโฟลเดอร์ว่าง

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


ฉันได้ค้นหาไปรอบ ๆ และดูเหมือนจะเป็นเรื่องง่าย ๆ ที่จะแก้ไขปัญหา แต่ฉันไม่สามารถทำให้มันทำงานได้ในตัวอย่างเฉพาะของฉัน แหล่งที่มาส่วนใหญ่แนะนำให้ใช้rsyncดังนั้นฉันจึงลงเอยด้วยคำสั่งต่อไปนี้:

rsync -ac --compare-dest=../old/ new/ difference/

สิ่งนี้จะ แต่เป็นสำเนาไฟล์ทั้งหมดจากใหม่จะแตกต่างกันแม้กระทั่งผู้ซึ่งเป็นเช่นเดียวกับในเก่า

ในกรณีที่ช่วยได้ (อาจเป็นคำสั่งที่ดีและความผิดอยู่ที่อื่น) นี่คือวิธีที่ฉันทดสอบนี้:

  1. ฉันทำทั้งสามโฟลเดอร์
  2. ฉันทำไฟล์ข้อความหลายที่มีเนื้อหาที่แตกต่างกันในเก่า
  3. ผมคัดลอกไฟล์จากเก่าไปใหม่
  4. ฉันเปลี่ยนเนื้อหาของไฟล์บางไฟล์เป็นไฟล์ใหม่และเพิ่มไฟล์เพิ่มเติมอีกสองสามไฟล์
  5. ฉันวิ่งคำสั่งดังกล่าวและการตรวจสอบผลในความแตกต่าง

ฉันกำลังมองหาวิธีการแก้ปัญหาสำหรับสองสามวันที่ผ่านมาและฉันขอขอบคุณความช่วยเหลือ ไม่จำเป็นต้องใช้ rsync แต่ฉันอยากรู้ว่าฉันทำอะไรผิดถ้าเป็นไปได้


มีความเป็นไปได้ที่ซ้ำกันของฉันจะบันทึกไฟล์ที่เปลี่ยนแปลงอย่างไร
wingedsubmariner

@wingedsubmariner ฉันไม่คิดว่ามันเป็นคำซ้ำที่ได้รับการยอมรับในคำถามที่เชื่อมโยงเป็นคำสั่งที่ OP กำลังถามคำถามเกี่ยวกับ
แบร์นฮาร์ด

@ เบอร์นาร์ดอ่าแย่จัง ฉันเดาว่าฉันเข้าใจผิดคำถามเดิม
wingedsubmariner

@wingedsubmariner ไม่ต้องกังวลคุณกล่าวว่า "เป็นไปได้" และผมเห็นว่ามันมีลักษณะคล้ายกันมาก :)
เบอร์นาร์ด

คำตอบ:


7

ฉันไม่แน่ใจว่าคุณสามารถทำได้ด้วยคำสั่ง linux ที่มีอยู่เช่น rsync หรือ diff แต่ในกรณีของฉันฉันต้องเขียนสคริปต์ของตัวเองโดยใช้ Python เนื่องจาก python มีโมดูล "filecmp" สำหรับการเปรียบเทียบไฟล์ ฉันโพสต์สคริปต์ทั้งหมดและการใช้งานในเว็บไซต์ส่วนตัวของฉัน - http://linuxfrechain.com/

มันใช้งานง่าย - ให้เส้นทางที่แน่นอนของไดเรกทอรีใหม่ไดเรกทอรีเก่าและไดเรกทอรีที่แตกต่างในลำดับนั้น

#!/usr/bin/env python

import os, sys
import filecmp
import re
from distutils import dir_util
import shutil
holderlist=[]

def compareme(dir1, dir2):
    dircomp=filecmp.dircmp(dir1,dir2)
    only_in_one=dircomp.left_only
    diff_in_one=dircomp.diff_files
    dirpath=os.path.abspath(dir1)
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in only_in_one]
    [holderlist.append(os.path.abspath( os.path.join(dir1,x) )) for x in diff_in_one]
    if len(dircomp.common_dirs) > 0:
        for item in dircomp.common_dirs:
            compareme(os.path.abspath(os.path.join(dir1,item)), os.path.abspath(os.path.join(dir2,item)))
        return holderlist

def main():
 if len(sys.argv) > 3:
   dir1=sys.argv[1]
   dir2=sys.argv[2]
   dir3=sys.argv[3]
 else:
   print "Usage: ", sys.argv[0], "currentdir olddir difference"
   sys.exit(1)

 if not dir3.endswith('/'): dir3=dir3+'/'

 source_files=compareme(dir1,dir2)
 dir1=os.path.abspath(dir1)
 dir3=os.path.abspath(dir3)
 destination_files=[]
 new_dirs_create=[]
 for item in source_files:
   destination_files.append(re.sub(dir1, dir3, item) )
 for item in destination_files:
  new_dirs_create.append(os.path.split(item)[0])
 for mydir in set(new_dirs_create):
   if not os.path.exists(mydir): os.makedirs(mydir)
#copy pair
 copy_pair=zip(source_files,destination_files)
 for item in copy_pair:
   if os.path.isfile(item[0]):
    shutil.copyfile(item[0], item[1])

if __name__ == '__main__':
 main()

21

ฉันพบสิ่งที่เป็นปัญหาในกรณีของฉัน:

ไฟล์ที่ฉันเปรียบเทียบมีเวลาประทับต่างกัน ฉันไม่ควรใช้อาร์กิวเมนต์-aฉันคิดว่าเพราะ rsync พยายามรักษาเวลาประทับเมื่อคัดลอกไฟล์ คำสั่งที่ใช้งานได้สำหรับฉันคือ:

rsync -rvcm --compare-dest=../old/ new/ difference/

ฉันคิดว่าการทดสอบนี้ด้วยตัวเลือก - a (เก็บถาวร) คุณควรใช้rsync -aเพื่อ "คัดลอก" ไฟล์เริ่มแรก (หรือเทียบเท่า cp) แล้วลบหรือแก้ไข (ฉันชอบที่จะติดกับ rsync เพราะฉันรู้ว่ามันสอดคล้องกับตัวเองโดยไม่คิดถึงสิ่งที่มันอาจจะทำ) ฉันคิดว่ามันควรจะทำงานกับคำสั่งดั้งเดิม ตัวเลือก -a รวมถึง -t (เปรียบเทียบโดยการประทับเวลา) ซึ่งเป็นทางเลือกที่จะ -c (เปรียบเทียบโดยการตรวจสอบ)
ปราชญ์

2
ในความคิดของฉันคำตอบนี้ควรเป็นคำตอบที่ยอมรับได้เพราะมันง่ายกว่ามาก นอกจากนี้ยังมีคำสั่งเพียงทำงานให้ฉันเมื่อฉันให้เส้นทางเต็มรูปแบบสำหรับและold/ new/
Yamaneko

ข้อแม้ดูเหมือนว่าการเปรียบเทียบปลายทางจะต้องเป็นเส้นทางที่สัมพันธ์กับความแตกต่างดังที่เห็นจากภายในปลายทางที่แท้จริง
Ryan Williams

1

สิ่งนี้อาจช่วยผู้อ่านบางคน: ใน Windows โปรแกรมฟรีแวร์รุ่นเก่า - Third Dir - ทำสิ่งที่ถูกถามตรงนี้ ไม่มีให้บริการผ่านทางผู้พัฒนา Robert Vašíček แต่ฉันแน่ใจว่าสามารถพบได้ผ่านที่เก็บบางแห่งออนไลน์

นี่คือคำอธิบายของนักพัฒนาซึ่งยังคงอยู่ในเว็บไซต์ของเขา:

Third Dir: สารบบไดเรกทอรีผิดปกติ - ไฟล์ต่าง ๆ จะถูกคัดลอกไปยังไดเรกทอรีที่สาม มันมีประโยชน์มากในการแตกไฟล์เช่นรูปถ่ายใหม่หรือรูปที่แก้ไขจากแผนผังไดเรกทอรีขนาดใหญ่บนดิสก์ถาวรไปยังโฟลเดอร์ชั่วคราวจากนั้นเพิ่มลงในซีดีที่เก็บถาวร (หมายเหตุ - ไฟล์ต้นฉบับจะถูกเปรียบเทียบกับซีดี) รุ่น 1.4 ขนาด 23kB สร้างเมื่อ 2005-02-12

ประวัติความเป็นมา: เวอร์ชั่น 1.14 - มีประสิทธิภาพมากขึ้นเมื่อเปรียบเทียบไฟล์หลายหมื่นไฟล์


0

วิธี rsync ที่กำหนดโดย Thane กับการเพิ่ม Yamaneko ใช้งานได้ดี แต่ปล่อยให้ไดเรกทอรีว่างเปล่า สำหรับฉันทางออกสุดท้ายคือในสองขั้นตอนสายแรก rsync กับเส้นทางเต็มแล้วคำสั่งค้นหาเพื่อลบไดเรกทอรีที่ว่างเปล่าทั้งหมด:

rsync -rvcm --compare-dest=/tmp/org/ /tmp/new/ /tmp/difference/
find /tmp/difference/ -d -type d -empty -exec rmdir {} \; -print

โปรดทราบว่าแม้จะมีตัวเลือก - ลิงค์ rsync ก็ไม่ได้เก็บลิงค์สัญลักษณ์ แต่คัดลอกข้อมูลปลายทางแทน


โปรดทราบว่าแทนคุณสามารถใช้-empty -exec rmdir {} \; -empty -delete
mivk

-3

ฉันใช้ dualpane XY Explorer (เชิงพาณิชย์) ซึ่งสามารถเล่นกลได้มากมายและนี่เป็นหนึ่งในนั้น เปิดCurrentในบานหน้าต่างเดียวและเก่าในอีกบาน เปิดใช้งานบานหน้าต่างปัจจุบัน ไปที่บานหน้าต่าง > เลือกการซิงค์ มันมี 5 ตัวเลือกให้เลือก:

  1. การแข่งขัน (ระบุไว้ในทั้งสอง)
  2. Uniques (ในบานหน้าต่างที่ใช้งานอยู่)
  3. ใหม่กว่า (ในบานหน้าต่างที่ใช้งานอยู่)
  4. ไฟล์ที่ไม่ซ้ำและใหม่กว่า (ในบานหน้าต่างที่ใช้งานอยู่)
  5. เลือกแล้ว (ที่เลือกในบานหน้าต่างอื่น)

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

ดังนั้นฉันจึงทำการค้นหาmbs-filesในรูทเก่าmailfolder(ในหนึ่งบานหน้าต่าง) และที่ใหม่ที่สุด (ในบานหน้าต่างอื่น) และทำการเปรียบเทียบผลการค้นหาในแต่ละบานหน้าต่าง ( ซิงค์เลือกเฉพาะเพื่อค้นหาอีเมลที่หายไประหว่าง อีกครั้งการติดตั้ง)! คุณสามารถตั้งค่าตัวเลือกมากมายได้เช่นกัน


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