Arquivos diferentes de dois diretórios

7

Existem dois diretórios que gostaria de comparar. Eu tentei diff mas inclui as mudanças dentro dos arquivos. Tudo que eu quero é algo assim

file a is just in /A 
file b is missing in /A 
file c changed
directory d is missing in /A 
directory e is just in /A

Eu acho que isso é comum quando se faz o patch de arquivos completos, mas não conheço uma boa solução.

    
por Wienczny 28.10.2009 / 20:59

7 respostas

17

Você está procurando

diff -rq (dir1) (dir2)

Prova de conceito:

#!/bin/sh
#create our test
mkdir -p /tmp/a/b
echo "test" >> /tmp/a/c
mkdir -p /tmp/a/d/e
echo "blah" >> /tmp/a/d/e/f #only exists here
mkdir -p /tmp/q/b
echo "testing" >> /tmp/q/c #/tmp/a/c shouldnt match
mkdir -p /tmp/q/d/e
echo "blah" >> /tmp/q/d/e/g #only exists here
diff -rq /tmp/a /tmp/q

resulta em:

Files /tmp/a/c and /tmp/q/c differ
Only in /tmp/a/d/e: f
Only in /tmp/q/d/e: g
    
por 28.10.2009 / 21:10
7

Você só precisa incluir o sinalizador -q para torná-lo breve:

# diff -q dir1 dir2
Files dir1/both and dir2/both differ
Only in dir1/: one
Only in dir2:/ two
    
por 28.10.2009 / 21:08
3

Para encontrar duplicações, você usa:

fdupes -r1 dir1 dir2

Embora os outros lhe tenham dado boas dicas, você também deve tentar.

Se você usar

fdupes -rd dir1 dir2

ele perguntará qual arquivo manter (os outros serão excluídos). Extremamente útil para remover duplicações (eu fiz um bom uso dele com minhas fotos)

NOTA: sim, eu sei que a questão não era exatamente sobre isso, mas talvez possa ajudar ele ou outros;)

    
por 29.10.2009 / 08:32
2

Se você quiser comparar arquivos com base em tamanho que você pode fazer:

# ls -al DIR_1 |awk '{print $5, $9}'|sort > 1.txt
# ls -al DIR_2 |awk '{print $5, $9}'|sort > 2.txt

e que:

# diff 1.txt 2.txt

para descobrir quais arquivos têm diferentes ou estão ausentes. Eu usei isso quando eu tive que comparar dois diretórios com arquivos muito grandes para ver quais arquivos não estão totalmente baixados.

    
por 26.08.2010 / 13:18
1

Você pode tentar um diff de ls :

ls A > a.txt
ls B > B.txt
diff a.txt b.txt

Não é um único comando, mas deve funcionar.

    
por 28.10.2009 / 21:07
1

A resposta clássica é o comando 'dircmp'. Ele tem suas verrugas (piping a saída através de 'pr' para paginar, por exemplo), mas se lhe daria uma lista de objetos apenas no diretório um ou diretório dois, e então para os arquivos comuns, ele reporta 'same' ou 'diferente' (e o tipo de arquivo para não-arquivos - diretórios, etc.).

O 'diff -rq' parece equivalente ou melhor que a saída de 'dircmp'.

    
por 28.10.2009 / 23:50
0

Eu perguntei a uma pergunta semelhante no Stack Overflow e as respostas que recebi pode ser de interesse para você. Eu estava particularmente interessado em encontrar arquivos ausentes ao comparar dois diretórios.

Eu também especifiquei que a solução deveria lidar com arquivos renomeados (por exemplo, se o arquivo A que estava no diretório 1 também está presente no diretório 2, mas foi renomeado, o script deve estar ciente disso).

A resposta que escolhi (está no topo) é bastante útil. Pode valer a pena dar uma olhada como ponto de partida para o seu script.

    
por 26.08.2010 / 13:39