Pesquisa por arquivos redundantes (idênticos)

Publicado por Marcio Gil (última atualização em 31/08/2010)

[ Hits: 4.628 ]

Download redund




Pesquisa por arquivos redundantes (idênticos).

Uso:
  redund [opções] [diretório] [diretório2]

Opções:
  -n, --name    Pesquisa com o mesmo nome (não verifica o conteúdo)
  -i, --ident   Pesquisa por arquivos idênticos (nome e conteúdo iguais)
  -t, --total   Pesquisa completa (nome diferente, mesmo conteúdo)
  -x "regex"    Remover da pesquisa arquivos conforme a expressão regular

Se não especificados, a opção será -i e o diretório será "."

  



Esconder código-fonte

#!/bin/bash
#
# redund: Pesquisa por arquivos redundantes (idênticos)
#

CMD=`basename $0`
DIR1=""
DIR2=""
OPC="i"
XREGEX=""
HELP=0

while [ $# -gt 0 ]
do
  case "$1" in

    --help|-\?)
    HELP=1
    ;;

    --name|-n)
    OPC="n"
    ;;

    --ident|-i)
    OPC="i"
    ;;

    --total|-t)
    OPC="t"
    ;;

    -x)
    shift
    XREGEX="$1"
    ;;

    -*)
    echo "$CMD: opção inválida: $1" 1>&2
    echo "Tente '$CMD --help' para mais informações" 1>&2
    exit 1
    ;;

    *)
    if [ "$DIR1" == "" ] ; then
      DIR1="$1"
      if [ ! -d "$DIR1" ] ; then
        if [ -e "$DIR1" ] ; then
          echo "$CMD: não é um diretório: $1" 1>&2
        else
          echo "$CMD: diretório inexiste: $1" 1>&2
        fi
        exit 1
      fi
    elif [ "$DIR2" == "" ] ; then
      DIR2="$1"
      if [ ! -d "$DIR2" ] ; then
        if [ -e "$DIR2" ] ; then
          echo "$CMD: não é um diretório: $1" 1>&2
        else
          echo "$CMD: diretório inexiste: $1" 1>&2
        fi
        exit 1
      fi
    else
      echo "$CMD: excesso de parâmetros: $1" 1>&2
      echo "Tente '$CMD --help' para mais informações" 1>&2
      exit 1
    fi
    ;;

  esac
  shift
done

if (( $HELP )) ; then
  echo "Pesquisa por arquivos redundantes (idênticos)."
  echo
  echo "Uso:"
  echo "  $CMD [opções] [diretório] [diretório2]"
  echo
  echo "Opções:"
  echo "  -n, --name    Pesquisa com o mesmo nome (não verifica o conteúdo)"
  echo "  -i, --ident   Pesquisa por arquivos idênticos (nome e conteúdo iguais)"
  echo "  -t, --total   Pesquisa completa (nome diferente, mesmo conteúdo)"
  echo "  -x \"regex\"    Remover da pesquisa arquivos conforme a expressão regular"
  echo
  echo "Se não especificados, a opção será -i e o diretório será \".\""
  echo
  exit 0
fi

if [ "$DIR1" == "" ] ; then
  DIR1="."
fi

echo -ne '...\r' 1>&2
if [ "$XREGEX" == "" ] ; then
  if [ "$DIR2" == "" -o "$DIR2" == "$DIR1" ] ; then
    FILES=( $(find $DIR1 -type f -printf '%f:%h\n' | sort \
            | sed "s/\([^:]*\):\(.*\)/$'\2\/\1'/;s/ /\\\{FONTE}40/g") )
  else
    FILES=( $( ( find $DIR1 -type f -printf '%f:%h\n' \
              && find $DIR2 -type f -printf '%f:%h\n' ) | sort \
            | sed "s/\([^:]*\):\(.*\)/$'\2\/\1'/;s/ /\\\{FONTE}40/g") )
  fi
else
  if [ "$DIR2" == "" -o "$DIR2" == "$DIR1" ] ; then
    FILES=( $(find $DIR1 -type f -printf '%f:%h\n' | grep -v "$XREGEX" | sort \
            | sed "s/\([^:]*\):\(.*\)/$'\2\/\1'/;s/ /\\\{FONTE}40/g") )
  else
    FILES=( $( ( find $DIR1 -type f -printf '%f:%h\n' \
              && find $DIR2 -type f -printf '%f:%h\n' ) | grep -v "$XREGEX" | sort \
            | sed "s/\([^:]*\):\(.*\)/$'\2\/\1'/;s/ /\\\{FONTE}40/g") )
  fi
fi

NF=${#FILES[*]}
if [ "$OPC" == "t" ] ; then
  NI=$(( ($NF + 1) * $NF / 2 ))
else
  NI=$NF
fi
if (( $NI > 250 )) ; then
  PERC=1
  echo -ne '0 %\r' 1>&2
else
  PERC=0
fi

K=0
N=0
for (( I = 0 ; I < NF ; I++ )) ; do
  FILE_I=`eval "echo ${FILES[$I]}"`
  for (( J = I + 1 ; J < NF ; J++ )) ; do
    FILE_J=`eval "echo ${FILES[$J]}"`
    if [ "$OPC" == "t" -o "${FILE_I##*/}" == "${FILE_J##*/}" ] ; then
      if [ "$OPC" == "n" ] || diff -q "$FILE_I" "$FILE_J" >/dev/null ; then
        echo "$FILE_I" "$FILE_J"
        (( N++ ))
      fi
    else
      if [ "$OPC" == "n" ] ; then
        (( I = J - 1 ))
      fi
      break
    fi
    (( K++ ))
  done
  if (( $PERC )) ; then
    if [ "$OPC" == "t" ] ; then
      echo -ne $(( $K * 100 / $NI ))' %\r' 1>&2
    else
      echo -ne $(( $I * 100 / $NF ))' %\r' 1>&2
    fi
  fi
done

if (( $PERC )) ; then
  echo -ne '     \r' 1>&2
fi

exit $N

Scripts recomendados

Barra de progresso em ASCII

Script em Xdialog para montar/desmontar dispositivos

MySQL brute-force

Mp3Gdown Pt.3

Teste de memória


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts