背景:将一些测试数据加载到测试环境(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
。