Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.604 ]
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
Instalação de servidor DHCP rápido e fácil
Enviar mensagem para os terminais ltsp
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Acessar ftp por nome ao invés de ip [RESOLVIDO] (5)
Estou com sede em aprender sobre o nosso querido Linux. (2)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta