如何编写高效的 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 -Isecondsdate -I例如)。ISO 格式的日期使用例如可以很好地排序为字符串sort

相关内容