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).


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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.