Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.815 ]
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
Relatórios do LightSquid por Grupos
Script para instalar e configurar o samba no Damn Small Linux
Contar o número de arquivos e subdiretórios de um diretório
Nenhum comentário foi encontrado.
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
É normal não gostar de KDE? (8)
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)









