sexta-feira, 14 de março de 2014

[Linux] Separando arquivos modificados através de script bash (Criando um pacote automaticamente)

[Linux] Copying modified files into a new folder using bash script


- Você programa alterando vários arquivos e não anota qual alterou ?
- Do you modify a lot of source codes and after don’t know which ones were modified ?
- Gostaria de montar um pacote com os arquivos modificados para atualizar o ambiente de produção ?
- Would you like to create a package to update the production environment ?
Seu problemas acabaram !!!
Your problems are over!


Se você é mais um programador rústico que vive com os lobos na montanha e altera códigos dos programas usando “nano” no terminal do Linux, saiba que você não está sozinho nesse mundo !
If you are a rustic programmer that lives in a mountain with wolves and modify system source codes using “nano” at Linux terminal, be aware that you aren’t alone in this world !


Eu fiz um Script Bash que verifica os arquivos alterados a partir de uma data/hora definidos e copia para um novo diretório mantendo toda estrutura de pasta. Com isso, teremos todos os arquivos modificados numa pasta, ou seja, um pacote pronto para atualizar a produção.
I developed a Bash script that uses a specified hour to find modified files in a folder and then copies all of them into a new folder keeping the same folder structure. With all modified files in one folder organized as the original one, we have a package and we can update the production environment.  


Acredito que isso tenha diversos usos, é só adaptar para o que precisa.
I believe this script has several utilities and can modified as much as you need.
Vamos ao código !
Let’s go to the codes !


*Crie uma nova pasta para o pacote e salve o script nela
*Create a new folder to the package and then save that script in this folder.



#!/bin/bash


#Pasta base, um nível acima da pasta principal
#Set base folder which must be above the main folder
dirIni="/media/4965-5CD0/Marcos/Sites e Flash/rollingsports/"
#Subdiretorio a partir do inicial(definido acima). Dessa pasta para baixo sera montado o pacote.
#Set the main folder. The search will start in this folder.
dirMain="site"
#Serao localizados todos os arquivos modificados a partir da data definida (YYYY-MM-DD).
#Set the initial date (YYYY-MM-DD) to find the files
datIni="2012-11-15"
#Extensoes a serem buscadas
#Set the files extensions (in this case .php and .tpl)
extensao="\(php\|tpl\)"


# Gera um arquivo com a data que definimos em datIni. Servirá para comparação logo abaixo.
# A temporary file will be created with the date of “datIni”. It will be used for file comparison.
touch --date $datIni /tmp/start


#Lista todos os arquivos da pasta principal modificados após a data definida.
# The command will list all modified files after the set date.
result="$(find "$dirIni$dirMain" -regex ".*$extensao$" -newer /tmp/start)"


nro=0 # Contador - Counter
nroCopiados=0


(
IFS=$'\n'
set +f


#Para cada arquivo encontrado, processar da seguinte forma:
#For each file, do the commands:
for arquivo in $result
do
#Pega o nome do arquivo e prepara-o para copiá-lo para uma nova pasta
#Get the filename and prepare the file to be copied into a new folder
d="${arquivo/$dirIni/}"
nome="$(basename "$arquivo")"
d="${d/$nome/}"


#Perguntar se quero adicionar o arquivo no pacote
#Here it will show the filename and ask you if you want to copy the file
read -p " Empacotar "$d$nome" ? (S/N) " ans


#Pega a resposta do usuário (S/N) e transforma a letra em maiúscula.
#Get the user’s answer and change the letter typed into uppercase
ans="$(echo $ans | tr '[:lower:]' '[:upper:]')";


#Caso o usuário digitou “S”, coloca o arquivo no pacote
#If the user has typed “S”, it means “YES” then the command will copy the file
if [ "$ans" == "S" ]
then
#Cria a estrutura de pasta dentro do pacote antes de copiar o arquivo
#Now it will create a folder before copying the file in order to keep the same organization
test -d "$d" || mkdir -p "$d" && cp $arquivo "$d"
let nroCopiados+=1 #Incrementa o contador.
echo $d$nome >> $dirMain"/pacote.log"   
fi


let nro+=1 #Incrementa o contador. Increase the counter
done


#Fim, mostra a quantidade de arquivos copiados e gera um log descrevendo o pacote.
#At the end the command will show you the number of copied files and it will save descriptions in a log file.
echo -e "\n\n Foram empacotados "$nroCopiados" arquivos dos "$nro" encontrados."


echo -e "\n\nForam empacotados "$nroCopiados" arquivos dos "$nro" encontrados." >> $dirMain"/pacote.log"
date +'%d/%m/%Y %H:%M' >> $dirMain"/pacote.log"
)




Nenhum comentário:

Postar um comentário