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

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

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:

  1. encontre todos os diretórios que se enquadram no padrão de data

  2. classifique 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.

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 -Isecondsou date -Ipor exemplo). As datas no formato ISO são classificadas bem como strings usando, por exemplo sort, .

informação relacionada