Pesquisa por arquivos redundantes (idênticos)
Publicado por Marcio Gil (última atualização em 31/08/2010)
[ Hits: 4.508 ]
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
suspender ou hibernar por dialog
Nenhum comentário foi encontrado.
Atenção a quem posta conteúdo de dicas, scripts e tal (2)
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
Dongle Bluetooth 5.0 não funciona no Pop Os 22.04 (4)
Acesso a internet servidor virtualizado (10)
Sistema da Coréia do Norte - Red Star OS (11)
redirecionando saida de comando touch para o AWK[AJUDA] (17)
Driver Realtek RTL8852BE não disponível para Ubuntu 22.04.4 LTS kernel... (5)