Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.880 ]
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
Uso de variáveis com a linguagem Ruby
Script para "Ler" arquivos de texto
Implementando um simples manipulador de eventos de teclado
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
Como impedir exclusão de arquivos por outros usuários no (Linux)
Cirurgia no Linux Mint em HD Externo via USB
Anúncio do meu script de Pós-Instalação do Ubuntu
Alguém executou um rm e quase mata a Pixar! (5)
Formas seguras de instalar Debian Sid (4)
Duas Pasta Pessoal Aparecendo no Ubuntu 24.04.3 LTS (12)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (5)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (6)









