BASH Shell Scripting assistência, script de backup extrai metadados do nome do arquivo e move o arquivo de acordo

2

Então eu preciso construir um script de shell (uma habilidade que eu sou um lixo, eu acho muito linear e fazer tudo um pipe) que irá se conectar a uma máquina remota em um diretório específico e todos os arquivos com mais de 5 minutos, extrair informações do nome do arquivo (detalhes de codificação abaixo) e espalhar os arquivos em diretórios relevantes baseados nele, ou criar os diretórios se eles não existirem no host de backup local.

Em uma dúzia de máquinas eu tenho diretório (vamos chamá-lo / Prod / Data /) cheio de arquivos milhares de arquivos chamados data-HOST-v.7.mmddyy.csv

exemplo: date-web2-v.7.052509.csv

Arquivos com mais de 5 minutos precisam ser retirados das máquinas remotas para uma pasta local / backup / archive / host / ano / mês / dia / csvs

exemplo / backup / archive / web2 / 2009/05/29 / csvs

Tenho certeza que posso fazer algo como ls -1 | cut -d "." -f3 para extrair a seção de data do arquivo, então use sed ou awk para isolar cada seção e produzir as variáveis de data para escolher em quais diretórios despejar os arquivos, fazer algo semelhante para pegar o host, mas não tenho certeza de como vai fazer essa correlação com um arquivo no qual executar um movimento. Não tenho certeza de como executar isso remotamente, talvez seja melhor scp todos os arquivos da máquina remota primeiro (curto de qualquer arquivo com menos de 5 minutos, talvez uma declaração find -mmin +5 possa ser usada para confirmar isso?) faça a classificação quando tudo estiver na máquina de backup.

Alguém seria tão gentil a ponto de me apontar na direção de um script de exemplo que possa fornecer funcionalidade semelhante? Tudo que escrevo tende a ser comando | comando | comando | etc ... e imagino que essa tarefa exigirá alguma dimensionalidade.

Obrigado pelo seu tempo.

    
por Nathan Milford 26.05.2009 / 22:17

3 respostas

0

Para referência futura, este é o script que eu criei:

#!/bin/bash
if [ $# != 1 ]
   then
      echo "usage:  slurp_vote_files.sh [user@server]"
      exit 1
fi
ssh $1 "find /Prod/Data/Votes/ -mmin +5 -type f" | while read line; do 
   vote_host='echo $line | cut -d"_" -f3'
   vote_year='echo $line | cut -d"." -f3 | sed 's/^..../20/''
   vote_month='echo $line | cut -d"." -f3 | sed 's/.\{4\}$//''
   mkdir -p /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   scp -q $1:$line /bkup/archive/finalized/$vote_host/$vote_year/$vote_month/votes/
   ssh -n $1 "rm -f $line";
done
exit 0

Pode não se alinhar ao objetivo / especificações da postagem original, mas funciona no meu caso específico.

    
por 27.05.2009 / 02:31
2

Pure Bash Solution, usando a expansão de parâmetros. Veja este para uma explicação do PE.

foo='date-web2-v.7.052509.csv'
file=${foo%*.csv}
date=${file##*.}

month=${date:0:2}
day=${date:2:2}
year=${date:4:2}

Eu provavelmente usaria o Perl para isso e usaria parênteses para capturar o que eu quero em grupos de uma expressão regular.

    
por 27.05.2009 / 03:04
0

O comando localizar tem opções para selecionar arquivos com base em sua idade. Veja as opções -amin, -atime, -cmin, -ctime, -mmin e -mtime.

Você poderia usar o find para construir uma lista de arquivos que você precisava mover, armazená-los em um arquivo e usá-los em um comando rsync com as opções --include-from = e --remove-source-files. / p>     

por 26.05.2009 / 22:40