İki klasörü nasıl karşılaştırır ve farkı üçüncü bir klasöre nasıl kopyalarsınız?


23

Üç klasörün var:

  • Geçerli dosyalarınızı içeren klasör akımı
  • eski , aynı dosyaların daha eski bir sürümünü içeren klasör
  • sadece boş bir klasör olan klasör farkı

Nasıl karşılaştırmak yapmak eski ile cari ve farklı (veya tamamen yeni) olan dosyaları kopyalamak akım için fark ?


Her yeri aradım ve ele almam gereken basit bir şey gibi görünüyor, ancak benim örneğimde çalışmasını sağlayamıyorum. Kaynakların çoğu, rsync kullanımını önerdi, bu yüzden aşağıdaki komutu verdim:

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

Bu ancak ne yapar, tüm dosyaları kopyalar olduğunu yeni için fark bile, aynıdır olanlar eski .

Yardım etmesi durumunda (belki komut iyidir ve hata başka bir yerdedir), şöyle denedim:

  1. Üç klasörü yaptım.
  2. Eskiden farklı içeriklere sahip birkaç metin dosyası hazırladım .
  3. Ben dosyaları kopyaladığınız eski için yeni .
  4. Bazı dosyaların içeriğini yeni olarak değiştirdim ve birkaç ek dosya daha ekledim.
  5. Yukarıdaki komutu çalıştırdım ve sonuçları farklı olarak kontrol ettim .

Son bir kaç gündür bir çözüm arıyordum ve yardım için minnettar kalırım. Mutlaka rsync kullanmak zorunda değil, ancak mümkünse neyi yanlış yaptığımı bilmek istiyorum.



@wingedsubmariner Bunun bir kopya olduğunu sanmıyorum, bağlantılı soruya kabul edilen cevap olarak, OP'nin hakkında bir soru sorduğu komuttur.
Bernhard 18

@ Bernhard Ah, benim hatam. Sanırım asıl soruyu yanlış anladım.
wingedsubmariner

@wingedsubmariner Endişelenmeyin, "mümkün" dedin ve çok benzer göründüğünü kabul ediyorum :)
Bernhard

Yanıtlar:


7

Bunu rsync veya diff gibi mevcut linux komutlarıyla yapıp yapamayacağınızdan emin değilim. Ancak benim durumumda Python kullanarak kendi senaryomu yazmam gerekti, çünkü python dosya karşılaştırması için "filecmp" modülüne sahipti. Tüm betiği ve kullanımı kişisel sitemde yayınladım - http://linuxfreelancer.com/

Kullanımı basittir - bu dizine yeni dizinin, eski dizinin ve fark dizininin tam yolunu verin.

#!/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

Benim durumumda sorunun ne olduğunu çözdüm:

Karşılaştığım dosyalar farklı zaman damgalarına sahipti. Ben kullanmamalıydım -a rsync dosyaları kopyalarken damgaları sağlamaya çalışıyordum çünkü argüman sanırım. Benim için çalışan komut şuydu:

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

Bunu -a (arşiv) seçeneğiyle test etmeyi düşünüyorum, rsync -aönce dosyaları (veya cp eşdeğeri) "kopyalamak", daha sonra silinmiş veya değiştirilmiş olmanız gerekir . (Rsync'e bağlı kalmayı seviyorum çünkü ne olabileceğini düşünmeden kendisinin tutarlı olduğunu biliyorum.) Bunun orijinal komutla çalışması gerektiğini düşünüyorum. -A seçeneği, -c (sağlama toplamı ile karşılaştır) alternatifi olan -t (zaman damgasıyla karşılaştır) içerir.
adaçayı

2
Benim düşünceme göre, bu cevap çok daha basit olduğu için kabul edilen cevap olmalıdır. Ayrıca, komut yalnızca old/ve için tam yolu sağladığımda benim için çalıştı new/.
Yamaneko

Uyarı, karşılaştır-dest'in gerçek destin içinden görüldüğü gibi farkın göreceli yolu olması gerektiği görünüyor
Ryan Williams

1

Bu, bazı okuyuculara yardımcı olabilir: Windows'ta daha eski, küçük bir ücretsiz program olan - Üçüncü Yön - burada tam olarak ne isteniyorsa onu yapar. Artık geliştirici Robert Vašíček aracılığıyla kullanılamaz. Ancak çevrimiçi olarak bazı depolar aracılığıyla bulunabileceğinden eminim.

İşte geliştiricinin açıklaması, sitesinde kalıyor:

Üçüncü Yön: Sıra dışı bir dizin eşleyici - farklı dosyalar üçüncü dizine kopyalanır. Yeni veya düzenlenmiş fotoğrafları sabit diskteki büyük bir dizin ağacından geçici klasöre çıkarmak, sonra bunları arşiv CD'sine eklemek çok yararlıdır (not - orijinal dosyalar CD ile karşılaştırılır). Sürüm 1.4, boyut 23kB. 2005-02-12 düzenlendi.

Tarihçe: Sürüm 1.14 - On binlerce dosya karşılaştırıldığında daha verimlidir.


0

Thane'nin Yamaneko eklemeleriyle verdiği rsync yolu harika çalışıyor ancak boş dizinler bırakıyor. Benim için son çözüm iki adımda gerçekleşti, önce tam yolla rsync, sonra tüm boş dizinleri kaldırmak için bir find komutu çağır:

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

Lütfen --links seçeneğiyle bile, rsync'in sembolik bağları tutmadığını, bunun yerine hedef verilerini kopyaladığını unutmayın.


Bunun yerine -empty -exec rmdir {} \;kullanabileceğinizi unutmayın -empty -delete.
mivk

-3

Ben çok hileci yapabilir çift bölmeli XY Explorer (ticari) kullanıyorum ve bu onlardan biri. CurrentBir bölmede aç ve diğerinde eski. Geçerli bölmesini etkinleştirin. Git Panes > Senkronizasyon Select. Size seçmeniz için 5 seçenek sunar:

  1. Maçlar (her ikisinde de listelenmiştir)
  2. Benzersiz (aktif bölmede)
  3. Daha yeni (etkin bölmede)
  4. Benzersiz ve Daha Yeni dosyalar (etkin bölmede)
  5. Seçildi (diğer bölmede seçilenler)

Şimdi sonuçtaki seçimi Currentistediğiniz yerden kopyalayabilirsiniz . mailfoldersEski kurulumlardan en son sürümleri karşılaştırmak için kullandım . Klasör yapısı oldukça karmaşıktı, ancak (neredeyse) hepsinin mbs-filesbenzersiz bir numarası vardı.

Bu yüzden mbs-fileseski kökte mailfolder(bir bölmede) ve en yenisinde (diğer bölmede) bir arama yaptım ve sırasında kaybolan postaları bulmak için her bölmedeki arama sonuçlarını karşılaştırdım ( Eşitleme Seçimi Benzersiz) )-yüklemelerini yeniden! Siz de birçok seçenek ayarlayabilirsiniz.


1
Standart olmayan yazılımlardan bahsediyorsanız, bir bağlantı eklemelisiniz. Eğer XYplorer'ı kastediyorsanız, bu OP'ye hiç yardımcı olmayacaktır.
Anthon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.