Como escrever um script bash eficiente para encontrar e classificar arquivos e diretórios, extraindo datas?

0

Plano de fundo: é uma medida temporária para carregar alguns dados de teste em um ambiente de teste (um banco de dados Sybase).

Eu tenho um monte de arquivos que eu tenho que importar no 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 uma instrução SQL especial para corrigir a data. Isto é 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:

  1. encontre todos os diretórios que se ajustam ao padrão de datas

  2. classifica as datas corretamente (muito importante para a configuração)

  3. 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.

    
por Anthony Kong 12.09.2011 / 02:02

1 resposta

2

É claro que 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órios (filtrados para validade) para um formato de hora classificável (neste caso, época Unix 'epoch'), classificando-os e convertendo-os de volta (para duas formas diferentes) ).

Se você está trabalhando com datas em mais do que um simples sentido de manipulação de strings, eu recomendo strongmente ler a página de manual para 'data'. De fato, leia-o duas vezes, pense bem sobre isso e leia-o novamente. 'date' é um comando extremamente poderoso em seu domínio.

Ah, e espero que a lição que você aprendeu com essa experiência seja que você deve SEMPRE usar datas no formato ISO ( date -Iseconds ou date -I para exemplos). As datas de formato ISO classificam-se bem como sequências de caracteres usando, por exemplo, %código%.

    
por 12.09.2011 / 07:00