Comparar recursivamente duas pastas
Publicado por Elgio Schlemer 29/01/2009
[ Hits: 25.560 ]
Homepage: https://profelgio.duckdns.org/~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
Cluster multi-master com MariaDB 10.1 + Galera
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (16)
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)