Script com rotinas interessantes para copiar e extrair arquivos

Segue um script para copiar dados para um outros computador e depois extrair so dados, que estão em formato ".tar". Pode parecer um pouco com "usar um canhão para matar mosca", mas a ideia é mais mostrar algumas rotinas que acho interessante. Por exemplo, a entrada do script deve ser o ano seguido do mês e separados por espaço - caso não seja esse o formato dos argumentos de entrada, o script pára ("exit 1"). Também tem duas rotinas para pegar, além do mês informado, o último dia do mês anterior e o primeiro dia do mês seguinte. Depois vem a rotina para copiar os dados (a opção R do comando rsync mantém estrutura de diretórios). Por último, a construção de dois vetores (de estações e de diretórios) para serem percorridos por um laço e executar a ação proposta.

#!/bin/bash
# Script para receber ano e mês e realizar função para todos os diretórios

if [ -z "$1" ]
  then
	echo "Indique ANO e MES como argumentos!"
	echo "./script.sh yyyy mm dd"
exit 1
fi
if [ -z "$2" ]
  then
	echo "Indique o MES como segundo argumento!"
	echo "./script.sh yyyy mm dd"
	exit 1
fi

ano=$1
mes=$2
dia=$3

host="192.168.0.1"

# Definir último dia do mês anterior
if [ "$mes" -eq "1" ]
  then
    ano_ant=$(($ano-1))
    mes_ant=12
  else
	ano_ant=$ano
	mes_ant=$(($mes-1))
fi
dia_ant=`echo $(cal $mes_ant $ano_ant) | awk '{print $NF}'`

# Definir primeiro dia do mês seguinte
if [ "$mes" -eq "12" ]
  then
    ano_pos=$(($ano+1))
    mes_pos=01
  else
	ano_pos=$ano
	mes_pos=$(($mes+1))
fi
dia_pos=01

# Envia dados para outro computador
sshpass -p "SENHA" rsync -avzR */BACKUP/$ano_ant/$ano_ant"-"$mes_ant"-"$dia_ant/ user@$host:/data/Sensores/
sshpass -p "SENHA" rsync -avzR */BACKUP/$ano/$ano"-"$mes"-"*/ user@$host:/data/Sensores/
sshpass -p "SENHA" rsync -avzR */BACKUP/$ano_pos/$ano_pos"-"$mes_pos"-"$dia_pos/ user@$host:/data/Sensores/

est=( Est1 Est2 Est3 )
# Criar vetor com os diretórios com os arquivos a serem extraídos
str=$dir_in'/'$ano_ant'/'$ano_ant'-'$mes_ant'-'$dia_ant" "`ls -d $dir_in'/'$ano'/'$ano'-'$mes'-'*`" "$dir_in'/'$ano_pos'/'$ano_pos'-'$mes_pos'-'$dia_pos
array=($str)

for estacao in "${est[@]}"; do
	echo "Extraindo "$estacao" "$ano"-"$mes
	# Diretorio de origem dos arquivos originais a serem extraídos
	dir_in='/data/Sensores/'$estacao'/BACKUP'
	for i in "${!array[@]}"; do
		diryymmdd=`echo "${array[$i]}"`
		echo $diryymmdd
		for dirdia in $diryymmdd/*.tar; do
			echo $dirdia
			# Extrair arquivos
			tar -xf $dirdia
		done
	done
done

exit 0

Caso precise juntar dois ou mais arquivos, é comum utilizar "cat arq1 arq2 > arqfinal" para colocar o conteúdo de arq2 logo depois de arq1 em um novo arquivo. Mas se é necessário colocar uma linha ao lado da outra (como se fosse unir colunas em um mesmo arquivo), existe o comando paste: "paste arq1 arq2". Ele irá unir a linha 1 de arq1 com a linha 1 de arq2, separando-as com um TAB, e assim sucessivamente. Caso queira substituir as tabulações por espaços em branco, utilize depois o comando "expand -t 1" (substitui 1 tab por 1 espaço).

Uma opção mais elaborada é através do seguinte comando: .join -t':' -1 N -2 N arq1 arq2 Ele permite juntar dois ou mais arquivos baseando-se em um campo em comum; nesse caso, ele define o separador de campos como "dois pontos" e as colunas 1 e 2 dos arquivos arq1 e arq2, respectivamente, como sendo os campos em comum para comparação.

Compartilhe o link desse texto, mas se for copiar algum trecho, cite a fonte. Valorize nosso trabalho.
Mais informações na licença de uso do site.