Encontre todas as pastas em um diretório com o mesmo conteúdo

10

No Ubuntu, existe alguém para encontrar pastas duplicadas em um diretório (ou seja, pastas com o mesmo conteúdo)? Acho que já existem algumas ferramentas de linha de comando disponíveis para encontrar arquivos duplicados (como fdupes), mas quero encontrar pastas duplicadas. Ou seja, encontre pastas que correspondam ao conteúdo dos arquivos que eles contêm (embora os nomes de arquivos e outros metadados possam ser diferentes).

Anderson Green
fonte
Posso começar gerando uma lista de todas as pastas em um diretório (classificado por tamanho) e depois verificar cada par de pastas com o mesmo comprimento.
Anderson Green
Defina "duplicado". Os arquivos dentro devem corresponder apenas ao conteúdo do arquivo? Nome do arquivo? Número do inode? Tamanho do arquivo?
Chris Baixo
@ChrisDown A pergunta foi atualizada.
Anderson Green
3
Sim. Diretórios são realmente apenas arquivos, portanto, sua declaração é ambígua. Ter o "mesmo conteúdo" na realidade significaria que os diretórios contêm as mesmas referências de inode. Não está claro se você quer dizer isso, ou se os arquivos dentro devem ter o mesmo conteúdo e, em caso afirmativo, se existem outras estipulações (mtime, nome do arquivo, etc.).
Chris Baixo
3
@ ChrisDown, quero dizer que os arquivos dentro devem ter o mesmo conteúdo.
Anderson Green

Respostas:

5
#!/bin/bash
shopt -s dotglob

for file in "$1"/*; do [[ -f "$file" ]] && d1+=( "$(md5sum < "$file")" ); done
for file in "$2"/*; do [[ -f "$file" ]] && d2+=( "$(md5sum < "$file")" ); done 

[[ "$(sort <<< "${d1[*]}")" == "$(sort <<< "${d2[*]}")" ]] && echo "Same" || echo "Different"

Você pode vê-lo em ação aqui:

$ mkdir 1 2
$ ./comparedirs 1 2
Same
$ cat > 1/1 <<< foo
$ cat > 2/1 <<< foo
$ ./comparedirs 1 2
Same
$ cat > 2/1 <<< bar
$ ./comparedirs 1 2
Different
Chris Down
fonte
Como esse script não foi testado, estou ansioso para ver se funciona da maneira que deveria funcionar.
Anderson Green
1
@AndersonGreen Verifique a resposta atualizada, testei-a.
22412 Chris Down
Agradável! Também deve haver um teste com cat > 1/2 <<< bare cat > 2/3 <<< bar para mostrar vários arquivos e diferentes metadados (== "Same")
nealmcb
@ ChrisDown: classifica no último passo necessário?
harish.venkat
Script elegante, apenas um pequeno erro é que ele retorna o mesmo quando um ou ambos os diretórios não existem. Deve ser facilmente solucionáveis se um é melhor no scripting do que eu
cosseno