Encontrando arquivos duplicados

1

Eu preciso escrever um script bash que encontre arquivos duplicados, mas além de md5sum , ele precisa usar cmp para fazer a verificação final. Eu tentei o comando abaixo na minha concha. Como posso adicionar um loop e colocá-lo em um script bash?

find . -type f | xargs -I%  md5sum % | sort | uniq -w32 -D| cut  -f3 -d' ' 
    
por el ab 05.10.2011 / 14:15

1 resposta

6

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:

  1. o arquivo que precisa ser comparado: $filename
  2. os arquivos que precisam ser comparados: o files array
  3. 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:

  1. remova o cut do seu pipeline
  2. altere o read para ler na soma md5 e no nome do arquivo
  3. 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 .

    
por 05.10.2011 / 16:10

Tags