Comparar recursivamente duas pastas

Publicado por Elgio Schlemer 29/01/2009

[ Hits: 25.262 ]

Homepage: https://profelgio.duckdns.org/~elgio

Download comparaPasta.sh




Este script foi desenvolvido para atender a pergunta do forum
http://www.vivaolinux.com.br/topico/Shell-Script/Comparar-arquivos-de-uma-pasta-com-arquivos-de-outr...

Percorre uma pasta e vê se a outra tem os mesmos arquivos, entrando em subdiretórios se for o caso.

Também disponível em http://gravatai.ulbra.tche.br/~elgio/disciplinas/?DISC=outras&MAT=VOL

  



Esconder código-fonte

#!/bin/bash

# TITULO: Programa em bash para comparar pastas
# DATA: 28/Jan/2009
#
# Programa em bash para comparar recursivamente duas pastas
# - informa quais arquivos tem em uma e que nao tem em outra
# - quais subpastas tem em uma que nao tem em outra
# - se houverem arquivos com mesmo nome em uma pasta e na outra,
#   informa se eles sao iguais ou diferentes
#
# Atendendo pergunta do forum Viva o Linux:
# http://www.vivaolinux.com.br/topico/Shell-Script/Comparar-arquivos-de-uma-pasta-com-arquivos-de-outra-pasta
#
# Elgio Schlemer


# Se faltou parametros, este help eh executado
function sintaxe ()
{

   cat  << END
Forma de uso:

$0 <pasta1> <pasta2>

pasta1 e pasta2 devem ser diretorios existentes e com permissao de leitura
END

}

# testa se os parametros sao dir (devem ser) e se podem ser abertos
function testa ()
{
   if [ "$#" != 2 ]
   then 
      printf "%${espaco}sERRO. Deve informar 2 pastas\n" ""
      return 1
   fi

   for d in $*
   do 
      if [ ! -d $d ]
      then
         printf "%${espaco}sERRO. '$d' nao eh um diretorio\n" ""
         return 1
      fi

      if [ ! -x $d ]
      then
         printf "%${espaco}sERRO. '$d' nao tem permissao de acesso\n" ""
         return 1
      fi
      if [ ! -r $d ]
      then
         printf "%${espaco}sERRO. '$d' nao tem permissao de leitura\n" ""
         return 1
      fi

   done
      
   return 0
}

# Compara todos os arquivos de uma pasta com outra pasta
# se encontrar uma subpasta, chama-se recursivo para compara-las tambem
function compara()
{
   # Este IFS eh util para lidar com (SIC) arquivos com espacos em branco
   IFS="\n"

   for arq in $1/*
   do
      nome="`basename "$arq"`"
      if [ -d "$arq" ]
      # Se eh um diretorio, chama recursivo
      then
         printf "\n%${espaco}sComparando pasta '$1/$nome' com '$2/$nome'\n" ""
         espaco=$(( $espaco + 4));
         export espaco

         if testa "$1/$nome" "$2/$nome"
         then 
            compara "$1/$nome" "$2/$nome"            
         fi
         espaco=$(( $espaco - 4))
         export espaco

         continue
      fi
   
      if [ -f "$arq" ] # se arquivo
      then
         if [ ! -f "$2/$nome" ]
         then
            printf "%${espaco}sarquivo '$nome' em '$1' mas nao em '$2'\n" ""
            continue
         fi
         if  `diff -q "$1/$nome" "$2/$nome" 2>&1 > /dev/null`
         then
            printf "%${espaco}sOK com '$1/$nome' e '$2/$nome'\n" ""
         else
            printf "%${espaco}s'$1/$nome' e '$2/$nome' sao diferentes\n" ""
         fi

      fi

   done

   for arq in $2/*
   do
      nome="`basename "$arq"`"
      if [ -d "$arq" ]
      then
         # Se eh um dir, na pasta $1 deve ter o mesmo dir
         if [ -d "$1/$nome" ]
         then
            continue # se tem, pula. Ja foram comparadas na etapa anterior
         else 
            printf "%${espaco}sERRO. '$nome' nao existe na pasta '$1' como diretorio\n" ""
            continue
         fi
      fi
      if [ -f "$arq" ]
      then
         if [ -f "$1/$nome" ]
         then
            continue
         else
            printf "%${espaco}sERRO. '$nome' nao existe na pasta '$1' como arquivo\n" ""
         fi
      fi
   done
}

# espaco eh usado para dar uma identacao nas mensagens
espaco=4
export espaco

# Programa principal
if ! testa $* 
then
   sintaxe $0
   exit 1
fi

printf "Comparando pasta '$1' com '$2'\n"
compara $1 $2

Scripts recomendados

Iniciar nova instância do Firefox quando o mesmo não está respondendo

Verificação e otimização do banco de dados MySQL

Troca de link em caso de queda de Internet (FAILOVER)

Projeto Wine's Faces

FIREWALL COM IPTABLES


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts