
Fundo:É uma medida temporária carregar alguns dados de teste em um ambiente de teste (um banco de dados Sybase).
Eu tenho vários arquivos que preciso importar para o banco de dados diariamente. Esses arquivos são organizados como tal
30Aug2011/IMPORT_ME.txt
31Aug2011/IMPORT_ME.txt
...
8Sep2011/IMPORT_ME.txt
9Sep2011/IMPORT_ME.txt
Após cada importação, preciso executar alguma instrução SQL especial para corrigir a data. Isso é o que eu fiz no script principal
import_file.sh 20Aug2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/8 Aug 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
...
import_file.sh 9Sep2011/IMPORT_ME.txt
cat rerun_import_file.tmpl | sed -e "s/XXX/9 Sep 2011/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
Então, suponho que posso melhorar isso:
encontre todos os diretórios que se enquadram no padrão de data
classifique as datas corretamente (muito importante para a configuração)
analise a data e defina a data de acordo com o arquivo sql
No entanto, meu bash script-fu não é bom o suficiente para fazer isso.
Responder1
Claro, perdi a parte de classificação da pergunta. Para responder a isso, proponho um modelo diferente que é mais simples em alguns aspectos:
ls */IMPORT_ME.txt | cut -d/ -f 1 | date --file=- +%s | sort -n | sed -e 's/^/@/' \
| while read DATE
do
FILENAME=`date -d ${DATE} +%-d%b%Y/IMPORT_ME.txt`
REPLACEMENT=`date -d ${DATE} +%-d %b %Y`
import_file.sh ${FILENAME}
cat rerun_import_file.tmpl | sed -e "s/XXX/${REPLACEMENT}/g" > rerun_import_files.sql
$ISQL -i rerun_import_files.sql
done
A chave aqui é a conversão inicial de todos os nomes de diretório (filtrados para validade) para um formato de hora classificável (neste caso, hora de 'época' do Unix), classificando-os e depois convertendo-os de volta (para duas formas diferentes).
Se você estiver trabalhando com datas além do sentido puramente de manipulação de strings, recomendo fortemente a leitura da página de manual de 'data'. Na verdade, leia duas vezes, pense bem e depois leia novamente. 'date' é um comando extremamente poderoso em seu domínio.
Ah, e espero que a lição que você aprendeu com essa experiência é que você SEMPRE deve usar datas no formato ISO ( date -Iseconds
ou date -I
por exemplo). As datas no formato ISO são classificadas bem como strings usando, por exemplo sort
, .