Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.884 ]
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á "."
#!/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
Tire screenshots com Scrot facilmente com Zscrot
Gerenciador Servidor de Arquivos
Automatizando o serviço do Redmine via webrick
Importar varius Emolticons de uma vez para amsn
Nenhum comentário foi encontrado.
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









