FTP de arquivos baseados na data

1. FTP de arquivos baseados na data

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 22/08/2007 - 12:05h

Olá amigos; Estou começando a migrar pra plataforma linux e peço ajuda de vcs nesse script pra rodar no servidor linux. Agradeço desde já a atenção de todos e aguardo suas respostas. t+

#!/bin/bash

# Cenário:
#
# Esse é um script que deverá executar o ftp de 04 arquivos de uma máquina linux para uma máquina windows todos os dias. Todos os arquivos estão no diretório /tmp/sage/arqs e no formato [mesdiaano-n.csv], onde mes é a sigla do mês, dia é o número do dia do ftp no formato xx (tem que ser em dois algarismos), e ano o ano do ftp no formato xx (somente os dois últimos números do ano); por fim n é um dos seguintes números 1,2,3 ou 4.

O script deverá identificar a data atual, definir a sigla do mes atual, o dia e o ano (ambos com dois numeros) e fazer o upload dos seguintes arquivos: mesdiaano-1.csv, mesdiaano-2.csv, mesdiaano-3.csv e mesdiaano-4.csv.
#
# Perguntas e Dúvidas
# Gostaria que vcs corrigem o código atual quanto a sintaxe. Fiz esse código em vb e algumas parte não sei converter para script shell. Tais partes estão sinalizadas com $#$.

ou seja, como faz isso com Shell script?????????? ; mas qualquer coisa q vcs virem q está errada é só falar.

# Vetor que tem as siglas de cada mês - vetor de strings

$#$ Dim nome_mes() As String = "jan", "fev", "mar", "abr", "mai", "jun", "jul", "ago", "set", "out", "nov", "dez"}


# Vetor que contém os números de dias para cada mês

$#$ Dim ndias_mes() As Integer = {31, -1, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}


# Obter a data atual em partes
dia=%d
nmes=%m
ano=%Y

dia=dia-1

if [dia = 0]
then
mes=mes-1
if [mes=0]
then
mes=12
ano=ano-1
else
if [mes = 2]
then
if [ano é bissexto] # Como eu faço pra saber se o ano é bissexto? como é o mod em shell script?
then
ndias_mes(1) = 29
else
ndias_mes(1) = 28
fi
dia = ndias_mes(mes)
fi
fi
else
------------------------------------
fi

$#$
$#$ sigla_mes = nome_mes(mes - 1)
$#$

If [dia < 10]
Then
dia = "0" & dia
fi

If [ano < 10]
Then
ano = "0" & ano
fi


# Como faço pra concatenar strings e colcoar o resultado em uma variável?
$#$
$#$ filename=sigla_mes & dia & ano
$#$

ftp -in << EOF
open 10.98.1.207
user anonymous newton.junior@eln.gov.br
passive
binary
lcd /tmp/sage/arqs

# Esse trecho de código do ftp vai funcionar?????
for i in 1 2 3 4
do
filename=sigla_mes & dia & ano & "-" & i & ".csv"
put filename
done

close
bye
EOF


  


2. Versão Semi-Corrigida

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 24/08/2007 - 16:22h

Pessoal, andei dando uma pesquisada nos artigos do VOL (ótima referência) e lendo um livro sobre script e consegui evoluir pra o seguinte código:

#!/bin/bash

nome_mes=("jan" "fev" "mar" "abr" "mai" "jun" "jul" "ago" "set" "out" "nov" "dez")
ndias_mes=(31 -1 31 30 31 30 31 31 30 31 30 31)

# Obter a data atual em partes
dia=$(date +%d)
mes=$(date +%m)
ano=$(date +%y)

*dia='expr $dia - 1'

if [ "$dia" -eq 0 ]
then
*mes='expr $mes - 1'
if [ "$mes" -eq 0 ]
then
mes=12
*ano='expr $ano - 1'
elif [ "$mes" -eq 2 ]
then
if [ *** como testar se o ano é bissexto? ]
then
((ndias_mes[1]=29))

else
((ndias_mes[1]=28))
fi
((ndias_mes[1]=28))
* dia=${ndias_mes[mes]}
fi
fi
fi


* sigla_mes=${ndias_mes[mes-1]}

If [ "$dia" -lt 10 ]
Then
dia=0"$dia"
fi

If [ "$ano" -lt 10 ]
Then
ano=0"$ano"
fi

filename=$sigla_mes$dia$ano

ftp -in << EOF
open 10.98.1.207
user anonymous newton.junior@eln.gov.br
passive
binary
lcd /tmp/sage/arqs

filename=$sigla_mes$dia$ano"-1.csv"
put filename

filename=$sigla_mes$dia$ano"-2.csv"
put filename

filename=$sigla_mes$dia$ano"-3.csv"
put filename

filename=$sigla_mes$dia$ano"-4.csv"
put filename

close
bye
EOF


************************************
Mas ainda está dando erro; não estou conseguindo executar os códigos com operações matemáticas(tais como somar, subtrair), indexar um vetor. Assinalei os códigos com ***. Gostaria de pedir pra vcs que corrigissem esse código pra mim pois tô dependendo disso pra continuar meu trabalho (faz uma semanda q não faço nada...só estudando)

Agradeço desde já e fico aguardando. t+




3. Só mais uma coisa

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 24/08/2007 - 16:23h

Eu uso o Red Hat Enterprise v 3.0 e acho que o shell dele é o: tcsh ou csh.......aguardando


4. Código Final (Corrigido)

Newton Teixeira
NewtonJr.

(usa CentOS)

Enviado em 28/08/2007 - 09:15h

Bom, vai o código funcional e rodando. Depois de estudar bastante (e sozinho), conseguir aprender o básico e escrever. Posto minha solução:

#!/bin/bash

nome_mes=("jan" "fev" "mar" "abr" "mai" "jun" "jul" "ago" "set" "out" "nov" "dez")
ndias_mes=(31 -1 31 30 31 30 31 31 30 31 30 31)

# Obter a data atual em partes
dia=$(date +%d)
mes=$(date +%m)
ano=$(date +%y)

dia=$(expr $dia - 1)

if [ "$dia" -eq 0 ]
then
mes=$(expr $mes - 1)
if [ "$mes" -eq 0 ]
then
mes=12
ano=$(expr $ano - 1)
elif [ "$mes" -eq 2 ]
then
if [ \( $(expr "$ano" % 4) -eq 0 -a $(expr "$ano" % 100) -ne 0 \) -o \( $(expr "$ano" % 400) -eq 0 \) ] # testar se ano [e bissexto
then
((ndias_mes[1]=29))
else
((ndias_mes[1]=28))
fi
((ndias_mes[1]=28))
dia=${ndias_mes[mes]}
fi
fi

sigla_mes=${nome_mes[$(expr $mes - 1)]}
echo $sigla_mes

filename1=$sigla_mes$dia$ano"-1.csv"
filename2=$sigla_mes$dia$ano"-2.csv"
filename3=$sigla_mes$dia$ano"-3.csv"
filename4=$sigla_mes$dia$ano"-4.csv"

ftp -in<< EOF
open 10.98.1.207
user anonymous newton.junior@eln.gov.br
passive
binary
lcd /tmp/sage/arqs

del "$filename1"
del "$filename2"
del "$filename3"
del "$filename4"

put "$filename1"
put "$filename2"
put "$filename3"
put "$filename4"
close
bye
EOF


Vai a minha contribuição. T+

ps: tô meio chateado, pois ninguém na comunidade me deu atenção, apesar de ter enviado vários emails para os top 20 da VOL;


5. Re: FTP de arquivos baseados na data

Aldefax G. Kuhn
agk

(usa Debian)

Enviado em 28/08/2007 - 15:19h

Vi ontem a msg no meu e-mail, então fica aqui meu byte de contribuição:


#!/bin/tcsh
export LANG=pt_BR

for i in `seq 4`
do
old_filename[$i]="`date --date "1 day ago" +%b_%d_%y`-$i.csv"
filename[$i]="`date +%b_%d_%y`-$i.csv"
done

ftp -in<< EOF
open 10.98.1.207
user anonymous newton.junior@eln.gov.br
passive
binary
del ${old_filename[1]}
del ${old_filename[2]}
del ${old_filename[3]}
del ${old_filename[4]}
put ${filename[1]}
put ${filename[2]}
put ${filename[3]}
put ${filename[4]}
close
bye
EOF


PS: Testei com bash e também com tcsh e funcionou perfeitamente. Tem n formas de se fazer isso, essa é mais uma delas.

[ ]'s







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts