Desde que você declara que este é o dever de casa, darei a você um conjunto de dicas e não uma solução.
Você pode começar com algo assim:
find . -type f|xargs -I% md5sum % |sort \
|uniq -w32 -D|cut -f3 -d' '|while read filename ; do
# code here
done
Dentro desse while
loop, filename
conterá o nome de um dos arquivos detectados pelo seu pipeline.
A idéia é comparar cada um com os arquivos anteriores. Para fazer isso, no final do loop, adicione o arquivo atual a um array:
count=0
find . -type f|xargs -I% md5sum % |sort \
|uniq -w32 -D|cut -f3 -d' '|while read filename ; do
# code here
files[$cout]="$filename"
count=$((count+1))
done
Tudo que você precisa agora é preencher #code here
:-) Você tem à sua disposição:
- o arquivo que precisa ser comparado:
$filename
- os arquivos que precisam ser comparados: o
files
array - o número de arquivos que devem ser comparados com
$count
(atente para erros off-by-one)
Você pode classificar tudo isso com um loop while
, comparando os arquivos $filename
e ${files[$some_counter]}
em cada etapa.
Para tornar isso melhor, você deve verificar apenas os arquivos com o mesmo md5sum
um contra o outro. Para isso, você poderia:
- remova o
cut
do seu pipeline - altere o
read
para ler na soma md5 e no nome do arquivo - redefinir a matriz
files
quando você detectar quando estiver passando para outra soma md5
Isso precisará de mais uma variável para acompanhar a soma "atual" de md5.
Você pode melhorar ainda mais evitando comparações redundantes. Para isso, você precisará adicionar um pouco mais de lógica para evitar adicionar um arquivo a files
se ele for idêntico a um já existente nesse array.
E você pode fazer sem a variável $count
.
E algo muito importante que você deve verificar (e corrigir, se necessário): verifique se o seu script funciona com nomes de arquivos ou diretórios que contenham espaços.
Leia as matrizes do bash .