Pesquisa por arquivos redundantes (idênticos)

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

[ Hits: 4.626 ]

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

Gerenciamento de usários do Squid usando Dialog

Mostra cores

Coleta de Performance com SAR (systat package)

backup Firebird em DVD

Montagem e desmontagem de dispositivos


  

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