Справочная информация. Это временная мера для загрузки некоторых тестовых данных в тестовую среду (база данных Sybase).

У меня есть куча файлов, которые я ежедневно импортирую в базу данных. Эти файлы организованы как таковые

30Aug2011/IMPORT_ME.txt
31Aug2011/IMPORT_ME.txt
...
8Sep2011/IMPORT_ME.txt
9Sep2011/IMPORT_ME.txt

После каждого импорта мне нужно выполнить какой-то специальный SQL-оператор, чтобы исправить дату. Это то, что я сделал в основном скрипте

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

Так что я полагаю, что могу сделать это лучше:

  1. найти все каталоги, которые соответствуют шаблону даты

  2. сортировать даты правильно (очень важно для настройки)

  3. разобрать дату и установить дату в соответствии с файлом sql

Однако мой bash-скрипт недостаточно хорош для этого.

1 ответ1

2

Конечно, я пропустил сортировку части вопроса. Чтобы ответить на этот вопрос, я предлагаю другую модель, которая несколько проще:

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

Ключевым моментом здесь является первоначальное преобразование всех (отфильтрованных по действительности) имен каталогов в сортируемый формат времени (в данном случае «эпохальное время» Unix), сортировка их, а затем преобразование их обратно (в две разные формы).

Если вы работаете с датами не только в смысле манипулирования строками, я настоятельно рекомендую прочитать справочную страницу «date». Фактически, прочитайте это дважды, подумайте об этом, затем прочитайте это снова. date является чрезвычайно мощной командой в своем домене.

О, и я надеюсь, что урок, который вы извлекли из этого опыта, заключается в том, что вы ВСЕГДА должны использовать даты в формате ISO (например, date -Iseconds или date -I ). Даты в формате ISO сортируются так же, как и строки, например, sort

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .