Compare as árvores de diretórios com relação ao nome do arquivo (e tamanho e data) [duplicado]

4

Eu quero verificar os resultados de uma restauração do backup. Isto é, porque o TimeMachine no MacOS me dá alguns erros e avisos estranhos e eu quero ter certeza, tudo está em seu lugar novamente após a restauração. Embora eu não confie na TimeMachine para colocar todos os arquivos de volta, confio nele para colocar todos os arquivos restaurados com o conteúdo correto.

Eu pensei em diff -r, mas passar por aproximadamente 300 GiB pode demorar eternamente. Eu estou bem para comparar, pelo menos, a presença de arquivos, mas comparando tamanho e data na mesma corrida é ainda melhor.

Estou ciente de soluções como

diff <(ls -R $PATH1) <(ls -R $PATH2)

mas a saída é difícil de ler. Eu prefiro uma única linha por arquivo encontrada em apenas um lado. Também tenho que confiar na continuação da árvore na mesma ordem em ambos os lados. Isso pode ser diferente porque os sistemas de arquivos podem ser diferentes.

Eu adoraria ter uma ferramenta para os preguiçosos, que leva dois patés e gera diferenças até qualquer nível desejado de inspeção, talvez algo fora do macports. Mas não temo muitos bashismos.

    
por Ariser 30.11.2014 / 16:21

2 respostas

2

A "solução" que você mencionou é realmente ruim (não é possível lidar com nomes estranhos de arquivos, por exemplo) e completamente desnecessária. Basta usar diff diretamente:

diff -r "$PATH1" "$PATH2"

Isso recursivamente ( -r ) compara os diretórios e informa se os arquivos estão presentes ou ausentes. Por exemplo:

$ tree
.
├── dirA
│   ├── file1
│   └── file2
└── dirB
    └── file{1}

$ diff -qr dirA dirB
Files dirA/file1 and dirB/file1 differ
Only in dirA: file2
Only in dirB: file3

A opção -q significa "silenciosa", ela informará somente se os arquivos são diferentes sem imprimir as diferenças. No exemplo acima, os arquivos dirA/file1 e dirB/file1 têm conteúdos diferentes. Este formato é tão simples quanto você pode esperar e será bastante rápido, mesmo para diretórios grandes.

    
por 30.11.2014 / 17:43
11

Aqui está sua solução:

rsync -nrv --delete dirA/ dirB/

Em vez de tornar as duas pastas idênticas, usamos o rsync para mostrar apenas o que faria . Esse é o efeito de -n . Cuidado, não esqueça de adicionar essa opção!

O -r significa uma varredura recursiva, o -v fornece a listagem detalhada desejada. Você pode adicionar outro -v para obter todos os iguais listados também.

O --delete diz ao rsync para simular a exclusão de arquivos de destino que não existem na origem. Sem o sinalizador -n , a pasta dirB seria idêntica a dirA .

Por padrão, o rsync verifica apenas o nome e o registro de data e hora dos arquivos, que é exatamente a opção rápida que você estava pedindo. Se você quiser um comportamento semelhante, como o comportamento do diff (e igualmente lento), você pode adicionar um sinalizador -c para impor a comparação da soma de verificação.

rsync -nrvc --delete dirA/ dirB/

Observe o uso de barras no final em dirA/ e dirB/ , elas são significativas em rsync . Para mais informações, estude a página rsync man, faz muito sentido se acostumar com esse poderoso comando.

    
por 23.12.2014 / 20:39