
Фон:Это временная мера по загрузке некоторых тестовых данных в тестовую среду (базу данных 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
Поэтому я полагаю, что могу сделать это лучше следующим образом:
найти все каталоги, которые соответствуют шаблону даты
правильно отсортируйте даты (очень важно для настройки)
проанализируйте дату и установите дату в соответствии с файлом sql
Однако мой скрипт-фу bash недостаточно хорош для этого.
решение1
Конечно, я пропустил часть вопроса о сортировке. Чтобы ответить на нее, я предлагаю другую модель, которая в некотором роде проще:
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
, .