Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.904 ]
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
Alterar o endereço MAC de uma interface de rede
Previsão do tempo em cores no terminal
Automatizando o serviço do Redmine via webrick
Adicionar agentes em uma ManageSystemList de ITM6
Nenhum comentário foi encontrado.
KDE Plasma - porque pode ser a melhor opção de interface gráfica
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









