Datas [RESOLVIDO]

1. Datas [RESOLVIDO]

Geraldo Augusto de Oliveira Quites
geraldoquites

(usa Suse)

Enviado em 22/01/2015 - 19:11h

Olá, estou montando um script que tem como finalidade pegar todos arquivos compactados que estão em pastas diárias, descompactá-los e coloca-los numa única pasta.

Onde ficam os arquivos compactados: \73\2013\January\01_01_2013\postfix - exemplo do dia 01.. tenho pastas para cada dia.
Para onde eles vão: \73\mensal

Até aí tudo bem, preciso saber como criar tipo um "goto" onde o sistema adicione "1" a cada dia e faça o serviço.
Outro detalhe: usando a fórmula - a=01 ele não considera o zero a esquerda e trata o resultado como 1 e não como 01 e minha pasta sempre tem o 0 inicial para os dias até 10.

Segue o script e agradeço qualquer ajuda.

#!/bin/bash
clear
echo "Qual ano? "
read ano

echo "Qual mes? "
read mes

case "$mes" in

"01")
nome_do_mes=January
dia=0


dia=$(($dia+1))
cd /73/$ano/$nome_do_mes/"0"$dia"_"$mes"_"$ano/postfix
cp postfix.tar /73/mensal
cd /73/mensal
/bin/tar -vzxf postfix.tar
cd home/postfix/empresa/pegatudo/Maildir/new
cp * /73/mensal
cd /73/mensal
rm -r home/
rm postfix.tar

(quando chega aqui ele precisa voltar adicionando 1 ao dia e fazendo todo processo novamente. Tem outro detalhe, tem meses com 28, 29, 30 e 31 dias)



  


2. MELHOR RESPOSTA

Perfil removido
removido

(usa Nenhuma)

Enviado em 22/01/2015 - 22:48h

geraldoquites escreveu:

Olá, estou montando um script que tem como finalidade pegar todos arquivos compactados que estão em pastas diárias, descompactá-los e coloca-los numa única pasta.

Onde ficam os arquivos compactados: \73\2013\January\01_01_2013\postfix - exemplo do dia 01.. tenho pastas para cada dia.
Para onde eles vão: \73\mensal


Diretórios separados com contrabarras ao invés de barras?! É certeza que isto é algum sistema baseado no Unix?


Até aí tudo bem, preciso saber como criar tipo um "goto" onde o sistema adicione "1" a cada dia e faça o serviço.
Outro detalhe: usando a fórmula - a=01 ele não considera o zero a esquerda e trata o resultado como 1 e não como 01 e minha pasta sempre tem o 0 inicial para os dias até 10.

Segue o script e agradeço qualquer ajuda.

#!/bin/bash
clear
echo "Qual ano? "
read ano

echo "Qual mes? "
read mes

case "$mes" in

"01")
nome_do_mes=January
dia=0


dia=$(($dia+1))
cd /73/$ano/$nome_do_mes/"0"$dia"_"$mes"_"$ano/postfix
cp postfix.tar /73/mensal
cd /73/mensal
/bin/tar -vzxf postfix.tar
cd home/postfix/empresa/pegatudo/Maildir/new
cp * /73/mensal
cd /73/mensal
rm -r home/
rm postfix.tar

(quando chega aqui ele precisa voltar adicionando 1 ao dia e fazendo todo processo novamente. Tem outro detalhe, tem meses com 28, 29, 30 e 31 dias)


Se consegui entender alguma coisa, você tem uma hierarquia de diretórios mais ou menos assim:

/73/2013/January/01_01_2013/postfix/postfix.tar
/73/2013/January/02_01_2013/postfix/postfix.tar
...
/73/2013/January/31_12_2013/postfix/postfix.tar
...

e deseja agrupar o conteúdo dos arquivos postfix.tar em diretórios subdivididos por mês ao invés de dias. Iniciou um script que faz a tarefa um a um para evitar sobrescrita, pois o nome do tarball é exatamente igual, travou no laço de repetição, poderia ser 'for' ou 'while', mas já viu também que terá problemas com o dias do mês cuja base numérica é arbitrária, sem falar que você assume que o diretório existe, haveria problema se ele não existir? Pois bem, frente a isto lhe faço uma sugestão: porque não inserir no nome tarball o data, agrupar e extrair? Exemplo:

ano='2013'
mes='01'
nome_do_mes=$(date -d$ano-$mes-01 +%B)

find /73/$ano/$nome_do_mes/ -type f -printf '%p %P\n' |
while read file date; do
IFS=$'_/' read d m y resto <<< "$date"
dest_file="postfix_$y-$m-$d.tar"
dest_dir="./73/mensal/$y-$m/"
[[ -d $dest_dir ]] || mkdir -pv $dest_dir
mv -iv $file $dest_dir/$dest_file
done


Após esse paço haverá um diretório, /73/mensal/2013-01/, com todos os arquivos do mês dentro. Creio que com "todo mundo junto" fica mais fácil de trabalhar porque a hierarquia de diretórios que você tem parece bastante desorganizada mas deve ter algum motivo para ser assim. Tenha backup em dia antes de qualquer teste.


3. Re: Datas [RESOLVIDO]

Geraldo Augusto de Oliveira Quites
geraldoquites

(usa Suse)

Enviado em 23/01/2015 - 13:47h

Caro textmode, muito obrigado pelo retorno.

Sim, errei ao postar \73\2013... sendo o correto /73/2013....

Você disse que minhas pastas estão desorganizadas, como você as organizaria?
Essa minha pergunta tem a finalidade de melhorar meus conhecimentos e até mesmo para dar uma organizada nas pastas de backup de meu servidor. Isso é importante, pois, as vezes que está de fora vê de outra forma e talvez bem melhor do quem está dentro... rs rs..

Esses arquivos compactados são os backups de emails que o servidor de email tira diariamente para o servidor de backup. Por isso eu criei as pastas diárias:
\73\2013\January\01_01_2013\postfix
\73\2013\December\31_12_2013\postfix

O problema é quando tenho que procurar um email, aí quero transformar meu backup em pastas mensais e não diárias.
Sua ideia será valiosa.

Vou entender melhor seu script e lhe retorno.

Muito obrigado.

Geraldo.



4. Re: Datas [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 23/01/2015 - 19:57h

geraldoquites escreveu:

Caro textmode, muito obrigado pelo retorno.

Sim, errei ao postar \73\2013... sendo o correto /73/2013....

Você disse que minhas pastas estão desorganizadas, como você as organizaria?

Essa minha pergunta tem a finalidade de melhorar meus conhecimentos e até mesmo para dar uma organizada nas pastas de backup de meu servidor. Isso é importante, pois, as vezes que está de fora vê de outra forma e talvez bem melhor do quem está dentro... rs rs..

Esses arquivos compactados são os backups de emails que o servidor de email tira diariamente para o servidor de backup. Por isso eu criei as pastas diárias:
\73\2013\January\01_01_2013\postfix
\73\2013\December\31_12_2013\postfix

O problema é quando tenho que procurar um email, aí quero transformar meu backup em pastas mensais e não diárias.
Sua ideia será valiosa.

Vou entender melhor seu script e lhe retorno.

Muito obrigado.

Geraldo.


Obs.: Não trabalho com pastas, mas vou te ajudar com os diretórios :P

O modo de organização depende muito da forma como pretende-se recuperar os dados versus a infraestrutura de armazenamento (procedimentos/hardware/software/retrições técnicas ...). Por exemplo, o modo mais simples seria apenas:

/73/postfix_20130101.tar
/73/postfix_20130102.tar
/73/postfix_20130103.tar

Mas pode ser que existam milhões de arquivos, daí seria melhor subdividir por ano e talvez por mês também. Nessa estrutura, para encontrar todos os arquivos de um mesmo
mês, você apenas faria:

find /73/ -type f -name postfix-${ano}${mes}\*|sort 


E nem precisaria criar um script para validar todas as entradas e todas as possibilidades dentro da árvore de diretórios para só então conseguir extrair alguma informação. Mas como disse anteriormente, depende da infra aí, imagino seja justamente ela que levou a criação da árvore de diretórios atual uma vez que NADA é por ACASO :P



5. Re: Datas [RESOLVIDO]

Geraldo Augusto de Oliveira Quites
geraldoquites

(usa Suse)

Enviado em 26/01/2015 - 09:12h

Bom dia textmode, obrigado pelo retorno.
Rodei seu script e ele não está criando corretamente os arquivos, mas posso imaginar que é uma situação que eu não expus.
Minhas pastas no servidor 73 ficam assim:
/73/2013/January/01_01_2013/postfix
/73/2013/January/01_01_2013/sql
/73/2013/January/01_01_2013/spool
.
.
.
Ou seja, dentro do dia 01_01_2013 eu tenho várias pastas e não somente a pasta postfix. Eu fiz um teste apagando todas pastas e deixando somente a pasta postfix e rodou legal. Como poderia ficar o script para ler somente a pasta postfix sem eu ter de apagar as outras pastas?

Tentei fazer umas alterações no script e não deu certo. Você tem como ajudar-me.

Obrigado.

Geraldo.





6. Re: Datas [RESOLVIDO]

Perfil removido
removido

(usa Nenhuma)

Enviado em 26/01/2015 - 10:55h

geraldoquites escreveu:

Bom dia textmode, obrigado pelo retorno.
Rodei seu script e ele não está criando corretamente os arquivos, mas posso imaginar que é uma situação que eu não expus.
Minhas pastas no servidor 73 ficam assim:
/73/2013/January/01_01_2013/postfix
/73/2013/January/01_01_2013/sql
/73/2013/January/01_01_2013/spool
.
.
.
Ou seja, dentro do dia 01_01_2013 eu tenho várias pastas e não somente a pasta postfix. Eu fiz um teste apagando todas pastas e deixando somente a pasta postfix e rodou legal. Como poderia ficar o script para ler somente a pasta postfix sem eu ter de apagar as outras pastas?

Tentei fazer umas alterações no script e não deu certo. Você tem como ajudar-me.

Obrigado.

Geraldo.




Basta ajustar os parâmetros do comando 'find'. Eu não sei se existem arquivos postfix.tar nos outros diretório, então vou enviar um método para restringir a busca a apenas o diretório "postfix" com exatamente cinco diretórios de profundidade (a contar da raiz):

find /73/$ano/$nome_do_mes/ -path '/*/*/*/*/postfix/postfix.tar' -printf '%p %P\n' 


ou

find /73/$ano/$nome_do_mes/ -mindepth 3 -maxdepth 3  -regex '.*/postfix/postfix.tar$' -printf '%p %P\n' 


Verifique se desta vez o comando 'find' exibe os resultado que espera.



7. Re: Datas [RESOLVIDO]

Geraldo Augusto de Oliveira Quites
geraldoquites

(usa Suse)

Enviado em 26/01/2015 - 13:26h

Amigo textmode, funcionou 100% alterando o find para - find /73/$ano/$nome_do_mes/ -path '/*/*/*/*/postfix/postfix.tar' -printf '%p %P\n' - eu só acrescentei no final da linha o caractere "|".
Agradeço imensamente a sua atenção e paciência em estar ajudando-me.
Com certeza aumentou o meu conhecimento no linux que ainda é muito pouco.
Vou tentar interpretar o seu código para eu poder usá-lo em outras situações.

Muito Obrigado.

Geraldo.








Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts