Comparar recursivamente duas pastas
Publicado por Elgio Schlemer 29/01/2009
[ Hits: 25.986 ]
Homepage: https://elgio.prof.nom.br/~elgio
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
#!/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
Script para criação de pacotes auto extrator.
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
Opções secretas em tema do Cinnamon
Como mapear unidade de rede no Linux
Como quebrar senha usando john the ripper
Alguém já testou o novo COSMIC Desktop? O que achou? (5)
Alguém pode me indicar um designer freelancer? [RESOLVIDO] (2)
Por que passar nas disciplinas da faculdade é ruim e ser reprovado é b... (2)









