Как написать эффективный bash-скрипт для поиска и сортировки файлов и каталогов, извлекая даты?

Как написать эффективный bash-скрипт для поиска и сортировки файлов и каталогов, извлекая даты?

Фон:Это временная мера по загрузке некоторых тестовых данных в тестовую среду (базу данных 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

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

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

Связанный контент