Linux: Comparar estrutura de diretórios sem comparar arquivos

53

Qual é a melhor e mais simples maneira de comparar duas estruturas de diretório sem realmente comparar os dados em arquivos? Isso funciona bem:

diff -qr dir1 dir2_

Mas é muito lento porque também compara os arquivos. Existe um switch para diff ou outra ferramenta cli simples para fazer isso?

    
por Jonah 22.07.2010 / 04:20

9 respostas

34

O seguinte (se você substituir o primeiro diretório por diretório1 e o segundo por diretório2) deve fazer o que você está procurando e rapidamente:

find directory1 -type d -printf "%P\n" | sort > file1
find directory2 -type d -printf "%P\n" | sort | diff - file1

O princípio fundamental é que ele imprime todos os diretórios, incluindo os subdiretórios em relação aos diretórios baseN do diretório.

Isso pode falhar (produzir saída wierd) se você tiver retornos de carro em alguns dos nomes de diretório, mas não em outros.

    
por 22.07.2010 / 04:59
33
vimdiff <(cd dir1; find . | sort) <(cd dir2; find . | sort)

lhe dará uma bela exibição lado a lado das duas hierarquias de diretório com quaisquer seções comuns dobradas.

    
por 23.07.2010 / 18:42
22

Eu geralmente uso rsync para essa tarefa:

rsync -nav --delete DIR1/ DIR2

SEJA MUITO CUIDADO para sempre usar a opção -n , aka --dry-run , ou sincronizará (altere o conteúdo dos) diretórios.

Isto irá comparar arquivos baseados em tempos e tamanhos de modificação de arquivos ... Eu acho que é o que você realmente quer, ou pelo menos você não se importa se isso acontecer? Eu tenho a sensação de que você quer que isso aconteça mais rápido , não que você precise ignorar a diferença entre o conteúdo do arquivo. Se você quiser que não liste arquivos diferentes com nomes idênticos, acho que a adição da opção --ignore-existing fará isso.

Esteja ciente de que não colocar um / no final de DIR1 fará com que ele compare o diretório DIR1 com o conteúdo de DIR2 .

A saída acaba sendo um pouco detalhada, mas mostrará quais arquivos / diretórios diferem. Arquivos / diretórios presentes em DIR2 e não em DIR1 serão precedidos pela palavra deleting .

Em algumas situações, a resposta do @ slartibartfast pode ser mais apropriada, embora seja necessário remover a opção -type d para ativar a listagem de arquivos que não são de diretório. rsync será mais rápido se você tiver um número significativo de arquivos / diretórios para comparar.

    
por 22.07.2010 / 19:48
16

Semelhante à resposta ls, mas se você instalar tree , poderá

tree dir1 > out1
tree dir2 > out2
diff out1 out2
    
por 31.05.2014 / 16:18
3

Eu estava apenas procurando por solução para esse problema. A solução que eu mais gostei foi:

comm <(ls DIR1) <(ls DIR2)

Dá-lhe 3 colunas: 1 - ficheiros apenas em DIR1, 2 - ficheiros apenas em DIR2, 3 - ficheiros apenas em DIR3 Para mais detalhes, veja esta postagem no blog.

    
por 14.10.2011 / 12:30
2
ls > dir1.txt

ls > dir2.txt

Depois, apenas divida as duas listas.

    
por 22.07.2010 / 04:43
2

Esta é a melhor solução

diff --brief -r dir1 dir2

- A opção de troca breve informa apenas se os arquivos são diferentes, não os detalhes da diferença.

    
por 29.10.2012 / 14:47
1

use "diff -qr" para obter os arquivos diferentes e, em seguida, filtre a comparação de arquivos com o grep para obter apenas os nomes de arquivos que estão apenas em um dos diretórios.

diff -qr dir1 dir2 | grep -v "Files.*differ" 
    
por 16.03.2013 / 20:01
-3

Acho que apenas o rsync é userfull. por quê?

diff é útil apenas para estruturas que mantêm arquivos e diretórios. O diff não fornece códigos de saída adequados quando usamos links simbólicos. Nessa situação, o diff pode retornar 2 códigos de saída, mesmo que src e dst sejam idênticos (horários, tamanhos, nomes, registros de data e hora, softlinks de indicação, etc.).

dir, o sistema de arquivos não garante a ordenação de arquivos, mesmo que o conteúdo do diretório em src e dst sejam idênticos. Talvez você deva filtrar a saída ls, classificando-a. Mas o ls puro exibe apenas nomes de nós.

talvez o script incluindo diff, cmp, test -X para os tipos de nó seja útil, mas lembre-se da sobrecarga feita por muitas execuções de teste / cmp. O script será muito lento.

Como de costume, se você deseja obter informações simples, "dirs é / não é idêntico", você deve usar o rsync com a opção -n (dry). Se você quiser encontrar o que é diferente, use o comando diff.

    
por 09.04.2013 / 12:43