列出按词法出现在给定前缀之后/大于给定前缀的文件(或者以正确的顺序运行数据库升级脚本)

列出按词法出现在给定前缀之后/大于给定前缀的文件(或者以正确的顺序运行数据库升级脚本)

我正在尝试创建一个运行大量 SQL 脚本的 shell 脚本。

我有这些文件:

$ ls 升级/
01-foo.sql 02-bar.sql 02-baz.sql 03-foo1.sql 04-buz.sql

我已经得到了当前数据库的版本,例如DB_VERSION=02

我现在如何轻松地循环并全局化前缀大于我的 $DB_VERSION 的文件,并按顺序运行它们?

即我想做

对于 f 在 ???? ;做
   mysql < $f
完毕

并且,在 DB_VERSION=02 的情况下,按顺序运行03-foo1.sql和,。04-buz.sql

答案1

初始设置:touch 01-foo.sql 02-bar.sql 02-baz.sql 03-foo1.sql 04-buz.sql 09-quux.sql 10-lala.sql 99-omg.sql

实际代码:curr=02; for file in ??-*.sql; do ver="${file:0:2}"; [ "$ver" -gt "$curr" ] && echo "$file"; done

即,将当前版本定义为02,然后查看所有文件(通配符按字母顺序排列),如果它们的数字前缀在数字上更大则执行它们。替换mysql(或者你有什么)echo

答案2

在 zsh 中:

DB_VERSION=02
glob="<$((DB_VERSION+1))->"
for x in $~glob-*; do mysql <$x; done

<LOW-UP> 全局运算符匹配某个范围内的整数。您只能使用文字整数,而不能使用计算结果。因此,我们首先构建一个 glob 模式作为参数的值,然后使用该参数作为 glob 模式,这要归功于~ 参数扩展选项

相关内容