Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.507 ]
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
Fazendo backup de vários arquivos no LINUX
Medir tempo de acesso a internet no log do Squid
Tradutor: ept ( English to Portuguese )
Enviar gráficos 2D pela janela de chat no Kopete
Nenhum comentário foi encontrado.
Agora temos uma assistente virtual no fórum!!! (247)
Manutenção de sistemas Linux Debian e derivados com apt-get, apt, aptitude e dpkg
Melhorando o tempo de boot do Fedora e outras distribuições
Como instalar as extensões Dash To Dock e Hide Top Bar no Gnome 45/46
Como Atualizar Fedora 39 para 40
Instalar Google Chrome no Debian e derivados
Consertando o erro do Sushi e Wayland no Opensuse Leap 15
Instalar a última versão do PostgreSQL no Lunix mantendo atualizado
Flathub na sua distribuição Linux e comandos básicos de gerenciamento
conflicting values set for option signed-by regarding source (1)
iso de sistema 32 bit em atividade (13)
Agora temos uma assistente virtual no fórum!!! (247)
Como adicionar módulo de saúde da bateria dos notebooks Acer ao kernel... (27)