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.