Como você compara duas pastas e copia a diferença para uma terceira pasta?

22

Você tem três pastas:

  • pasta atual , que contém seus arquivos atuais
  • pasta antiga , que contém uma versão mais antiga dos mesmos arquivos
  • pasta difference , que é apenas uma pasta vazia

Como você compara antigo com atual e copia os arquivos que são diferentes (ou totalmente novos) em atual para diferença ?

Eu pesquisei por todos os lados e parece ser uma coisa simples de resolver, mas não consigo fazê-lo funcionar no meu exemplo em particular. A maioria das fontes sugeriu o uso de rsync , por isso acabei com o seguinte comando:

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

O que isto faz, no entanto, é copiar todos os arquivos de novo para difference , mesmo aqueles que são os mesmos que em old . / p>

Caso isso ajude (talvez o comando esteja bem e a falha esteja em outro lugar), é assim que eu testei isso:

  1. Eu fiz as três pastas.
  2. Eu fiz vários arquivos de texto com diferentes conteúdos em antigo .
  3. copiei os arquivos de antigo para novo .
  4. Alterei o conteúdo de alguns dos arquivos em novo e adicionei alguns arquivos adicionais.
  5. Eu executei o comando acima e verifiquei os resultados em difference .

Eu tenho procurado uma solução para os últimos dois dias e eu realmente aprecio alguma ajuda. Não necessariamente tem que estar usando o rsync, mas eu gostaria de saber o que estou fazendo errado, se possível.

    
por Thane 08.12.2013 / 04:20

5 respostas

7

Não tenho certeza se você pode fazer isso com qualquer comando linux existente, como rsync ou diff. Mas no meu caso eu tive que escrever meu próprio script usando Python, já que python tem o módulo "filecmp" para comparação de arquivos. Eu postei todo o script e uso em meu site pessoal - link

O uso é simples - fornece o caminho absoluto do novo diretório, diretório antigo e diretório de diferenças nessa ordem.

#!/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()
    
por 08.12.2013 / 18:51
20

Eu descobri qual era o problema no meu caso:

Os arquivos que eu estava comparando tinham timestamps diferentes. Eu não deveria ter usado o argumento -a , eu suponho porque o rsync estava tentando preservar os timestamps ao copiar arquivos. O comando que funcionou para mim foi:

rsync -rvcm --compare-dest=../old/ new/ difference/
    
por 08.12.2013 / 19:51
1

Isso pode ajudar alguns leitores: No Windows, um programa freeware mais antigo - o Third Dir - faz exatamente o que está sendo solicitado aqui. Não está mais disponível através do desenvolvedor, Robert Vašíček. Mas tenho certeza que pode ser encontrado através de alguns repositórios online.

Esta é a descrição do desenvolvedor, que permanece no site dele:

Terceiro diretório: um sincronizador de diretório incomum - os diferentes arquivos são copiados para o terceiro diretório. É muito útil extrair por ex. fotos novas ou editadas de uma árvore de diretórios enorme em disco fixo para pasta temporária, então adicione-as ao CD de arquivamento (note - os arquivos originais são comparados com o CD). Versão 1.4, tamanho 23kB. Criado em 2005-02-12.

História: Versão 1.14 - Mais eficiente quando muitos dos milhares de arquivos são comparados.

    
por 13.02.2015 / 22:01
0

A maneira rsync dada por Thane com as adições do Yamaneko funciona muito bem, mas deixa diretórios vazios. Para mim, a solução final foi em duas etapas, primeiro chamar rsync com caminho completo e, em seguida, um comando find para remover todos os diretórios vazios:

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

Por favor, note que, mesmo com a opção --links, o rsync não manteve links simbólicos, mas copiou os dados de destino.

    
por 02.05.2016 / 17:55
-3

Eu uso o dualpane XY Explorer (comercial), que pode fazer muitos truques e esse é um deles. Abra Current em um painel e Antigo no outro. Ative o painel Atual. Vá para Painéis > Sincronizar Selecione. Dá-lhe 5 opções para selecionar:

  1. Correspondências (listadas em ambos)
  2. Uniques (no painel ativo)
  3. Mais recente (no painel ativo)
  4. Arquivos exclusivos e mais recentes (no painel ativo)
  5. Selecionado (aqueles selecionados no outro painel)

Agora você pode copiar a seleção resultante de Current para onde quiser. Eu usei para comparar mailfolders de instalações antigas com as mais recentes. A estrutura da pasta era bastante complexa, mas (quase) todos os mbs-files tinham um número exclusivo.

Então, fiz uma pesquisa em mbs-files na raiz antiga mailfolder (em um painel) e no mais novo (no outro painel) e fiz uma comparação nos resultados de pesquisa em cada painel ( Sincronizar Selecione Único , para encontrar e-mails que desapareceram durante a reinstalação! Você pode definir muitas opções também.

    
por 24.01.2014 / 13:52