script para excluir arquivos duplicados usando md5

1

Eu quero escrever um script para encontrar arquivos duplicados em um determinado diretório e excluir a cópia, dependendo do código hash. Quando executo o script, ele apaga a cópia e o arquivo original.

Aqui está o meu código:

#!/bin/bash
a=1;
b=0;
c=1;

while true
do
echo "Enter the directory:"
read directory
if [ -d $directory ]; then
break
else
echo "Invalid directory"
fi
done

for FILE in 'ls $directory'
do
b='expr $b + $a'
if [ $b -gt 2 ]
then
h= 'md5sum $directory/$FILE | awk '{ print $1 }''
a=0;
for f in 'ls $directory'
do
a='expr $a + $c'
if [ $a -gt 2 ]
then
s= 'md5sum $directory/$FILE | awk '{ print $1 }''
if [ "$f" == "$FILE" ]
then
break
else
if [ "$s" = "$h" ]
then
rm -rf $directory/$FILE
fi
fi    
fi
done
fi
done
    
por user3125580 27.05.2014 / 18:00

1 resposta

1

Seus scripts pegam o primeiro arquivo no diretório e comparam com todos os arquivos lá, assim o primeiro arquivo é verificado contra si mesmo. Que retornará o mesmo hash MD5. Porque $FILE e $f são exatamente iguais. Você deve alterar o script para comparar apenas os arquivos e evitar comparar um arquivo consigo mesmo:

#!/bin/bash
while true
do
  echo "Enter the directory:"
  read directory
  if [ -d $directory ]; then
    break
  else
    echo "Invalid directory"
  fi
done

for FILE in 'ls $directory'
do
  if [ ! -f $FILE ]; then
    break;
  fi
  h='md5sum $directory/$FILE | awk '{ print $1 }''
  for f in 'ls $directory'
  do
    if [ -f $f ] && [ $FILE != $f ]; then
      s='md5sum $directory/$f | awk '{ print $1 }''
      if [ "$s" = "$h" ]; then
        echo Removing $f
        rm -rf $directory/$f
      fi
    fi
  done
done

Dito isto, você pode encontrar dois arquivos diferentes que lançam o mesmo hash MD5. Não é comum nem fácil, mas certamente não é impossível. Então, esse script pode excluir dois arquivos diferentes "pensando" que eles têm o mesmo conteúdo.

Um script mais seguro seria este:

#!/bin/bash
while true
do
  echo "Enter the directory:"
  read directory
  if [ -d $directory ]; then
    break
  else
    echo "Invalid directory"
  fi
done

for FILE in 'ls $directory'
do
  if [ ! -f $FILE ]; then
    break;
  fi
  for f in 'ls $directory'
  do
    if [ -f $f ] && [ $FILE != $f ]; then
      cmp -s $directory/$FILE $directory/$f
      if [ "$?" -eq 0 ] ; then
        echo Removing $f
        rm -rf $directory/$f
      fi
    fi
  done
done
    
por 27.05.2014 / 18:56