Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

1. Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Laercio Junior
ljvgsilva

(usa Debian)

Enviado em 28/01/2009 - 16:34h

Estou precisando de um script que compare o conteudo de uma pasta com outra pasta, informando os arquivos que não existem e os arquivos que são diferentes.
Exemplo:
pasta1 => arquivos: arq1 / arq2 / arq3 / arq4
pasta2 => arquivos: arq1 / arq2 / arq3

depois da comparação devolver:

- arquivos que não existem:
arq4

- arquivos diferentes:
arq2
arq3

obs: com a possibilidade de gerar um arquivo txt com o resultado.
a sintaxe seria: compara pasta1 pasta2


  


2. MELHOR RESPOSTA

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 29/01/2009 - 09:18h

O script que escrevi para comparar pastas foi publicado aqui no VOL
http://www.vivaolinux.com.br/script/Comparar-recursivamente-duas-pastas/


3. Re: Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Rafael Arcanjo
ST. RaLF

(usa Arch Linux)

Enviado em 28/01/2009 - 16:41h

cmp

Compara dois arquivos de qualquer tipo (binário ou texto). Os dois arquivos especificados serão comparado e caso exista diferença entre eles, é mostrado o número da linha e byte onde ocorreu a primeira diferença na saída padrão (tela) e o programa retorna o código de saída 1.

cmp [arquivo1] [arquivo2] [opções]

Opções:

arquivo1/arquivo2
Arquivos que serão comparados.
opções
-l
Mostra o número do byte (hexadecimal) e valores diferentes de bytes (octal) para cada diferença.
-s
Não mostra nenhuma diferença, só retorna o código de saída do programa.

Use o comando zcmp para comparar diretamente arquivos binários/texto compactados com gzip.

Exemplo: cmp teste.txt teste1.txt.


4. Hoje eu uso o comando cmp

Laercio Junior
ljvgsilva

(usa Debian)

Enviado em 28/01/2009 - 17:01h

rafael.wzs eu já utilizo o comando cmp, o meu problema é que nas pastas existem vários arquivos. Comparar um a um é o problema. Gostaria de saber como eu posso utilizar este comando em um script sem ter que especificar o nome dos arquivos. A ideia seria que o script verificaria os arquivos na pasta1 automaticamente e compararia com a pasta2.
Obrigado pela atençao. Ainda estou engatiando na criar script.


5. Re: Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Rafael Arcanjo
ST. RaLF

(usa Arch Linux)

Enviado em 28/01/2009 - 17:07h

Ata, entendi, você pode usar o diff.


6. comando diff

Laercio Junior
ljvgsilva

(usa Debian)

Enviado em 28/01/2009 - 17:19h

Rafael, o comando diff é utilizado para comparar arquivos txt, no meu caso a comparação tem que ser binaria o comando ideal seria cmp. O problema é fazer o script. O script teria que ler a pasta1 arquivo por arquivo automaticamente e comparar com os arquivos da pasta2 exibindo só o nome dos arquivos diferentes.


7. Re: Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Rafael Arcanjo
ST. RaLF

(usa Arch Linux)

Enviado em 28/01/2009 - 17:42h

Então creio eu que o melhor seria fazer um loop com o for para percorrer todos os arquivos, e comparar com o outro arquivo de outra pasta.


8. neliobjr

nelio
neliobjr

(usa Red Hat)

Enviado em 28/01/2009 - 17:47h

Cara trabalha com alguma coisa em cima desse script q eu fiz, acho que te dará uma luz, qualquer coisa posta ai q te ajudo.

http://www.vivaolinux.com.br/dica/Comparar-pasta-origem-com-pasta-destino-e-copiar-os-arquivos-que-f...

att.
Nélio


9. Re: Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 28/01/2009 - 18:17h

Coloquei o que fiz no meu site:
http://gravatai.ulbra.tche.br/~elgio/disciplinas/?DISC=outras&MAT=VOL

Veja o arquivo de nome "Programa em bash para comparar pastas" em HTML (colorido) ou txt (para fazer download)



10. CMP ou diff?

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 28/01/2009 - 20:11h

Ora, eu não vi diferença significativa. É errado dizer que o diff só serve para txt. Ele compara binários TAMBÉM. Se ele não identificar o arquivo como TEXTO, apenas ele não irá imprimir as diferenças, apenas o status: se iguais ou diferentes. O diff tem tantos parâmetros que dá até para pedir que ele mostre as diferenças (por sua conta e risco, pois a tela ficará suja com caracteres binários). Logo, o diff pode ser usado tranquilamente.

A única "vantagem" que vi do cmp é que ele diz qual linha e qual byte houve a primeira diferença, mas não entendo como esta informação pode vir a ser útil em arquivos binários.

Em relação ao desempenho, par dois arquivos IDÊNTICOS de 600M o cmp levou a melhor:
$ time diff lixo1.bin lixo2.bin

real 0m1.487s
user 0m1.040s
sys 0m0.432s

$time cmp lixo1.bin lixo2.bin

real 0m1.328s
user 0m0.836s
sys 0m0.476s

Mas quando um dos arquivos tem uma diferença no FIM o diff levou a melhor:

$time cmp lixo1.bin lixo3.bin
cmp: Fim de arquivo (EOF) em lixo1.bin

real 0m1.309s
user 0m0.876s
sys 0m0.428s

$ time diff lixo1.bin lixo3.bin
Os arquivos lixo1.bin e lixo3.bin são diferentes

real 0m0.005s
user 0m0.000s
sys 0m0.004s

E olha a ENORME DIFERENÇA!
(neste caso o lixo3.bin é um byte maior. Acho que o diff usou isto para dizer que são diferentes sem precisar percorrer o arquivo. Seria inteligente...)


11. como executar o script

Laercio Junior
ljvgsilva

(usa Debian)

Enviado em 29/01/2009 - 10:54h

Elgio, baixei o script só que não consigo executar o mesmo. Ao executar recebo a mensagem:"bash: comparaPasta.sh: command not found."
Eu segui o seguinte procedimento:
baixei o script executei o comando: chmod +x comparaPasta e mesmo assim recebi a mensagem acima.
Eu ainda estou engatinhando no linux. Qual foi o meu erro na execução do script?


12. Re: Comparar arquivos de uma pasta com arquivos de outra pasta [RESOLVIDO]

Elgio Schlemer
elgio

(usa OpenSuSE)

Enviado em 29/01/2009 - 11:06h

Baixaste de onde?

Pode ser que no processo de download ele tenha sido erroneamente convertido para TEXTO DOS, com quebras de linha CR+LF ao invés de apenas LF.

Se tu usas o vim, podes abrir ele no vim só para ver se ele identifica como dos (ele coloca a string [dos] ao lado do nome).

Se for isto tu precisas (a) baixar novamente, talvez aqui no VOL ou (b) converter,

A maioria das distribuições tem o utilitário dos2unix nativo para fazer isto:

elgio@didake:~> dos2unix comparaPasta.sh
dos2unix: converting file comparaPasta.sh to UNIX format ...
elgio@didake:~>

(podes executar o dos2unix mesmo que o arquivo não seja dos. Nada de errado acontece)

Se não for isto, pode ser o #!/bin/bash no inicio. Talvez este não seja o caminho do teu bash (muito raro que não seja). De qualquer maneira um:

elgio@didake:~> which bash
/bin/bash
elgio@didake:~>

vai te revelar onde está na tua distro. Se não for /bin/bash (for /usr/bin/bash por exemplo) precisas editar o script e trocar no #!/bin/bash para o correto.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts