如何以与flyway在bash中执行文件的顺序相同的顺序列出文件?

时间:2018-06-25 15:17:23

标签: bash find flyway ls

我有flyway迁移脚本,其命名如下。

V1__description.sql
V2.001__description.sql
V2.002__description.sql
V2__description.sql

上面是ls列出的顺序,或者是find的默认排序顺序。通过飞行路线执行它们的顺序是

V1__description.sql
V2__description.sql
V2.001__description.sql
V2.002__description.sql

是否有一种方法可以使用bash sort命令以flyway执行文件的顺序列出文件?这些文件无法重命名。

2 个答案:

答案 0 :(得分:1)

您的问题的答案是“不。至少不是它本身。”

首先,没有“ bash sort命令”。 sort命令实际上不是bash的一部分,它是操作系统提供的单独工具。尽管其用法因操作系统而异,但据我所知,没有哪个版本会按照您的要求对输入内容进行排序。 [1] 通过运行{{3}了解有关其功能的更多信息。 }。

一种选择可能是通过某种使文件列表可排序的方式流式传输文件列表,然后在排序后通过反向转换将其流式传输:

$ sed 's/^\(V[0-9]\)_/\1.000_/' files.txt | sort -n | sed 's/^\(V[0-9]\)\.000_/\1_/'

[1]我希望在这一点上得到纠正。

答案 1 :(得分:1)

我猜想flyway首先执行V2__description.sql,然后执行V2.001__*.sql等,因为逻辑上将在以后应用它们?然后,您可以更改其名称进行排序(并在排序后 之后将其改回):

(
  echo "V1__description.sql"
  echo "V2.001__description.sql"
  echo "V2.002__description.sql"
  echo "V2__description.sql"
) | sed 's/\./_DOT_/g' | sort | sed 's/_DOT_/./g'

这会将所有点更改为_DOT_进行排序,然后再将其更改回。

如果您要完成的工作比较复杂(例如下划线,破折号,点和加号的排序顺序为+_-.),则可以将它们来回更改:

… | sed -e 's/_/_1UNDERSCORE_/g' \
        -e 's/\+/_0PLUS_/g' \
        -e 's/-/_2DASH_/g' \
        -e 's/\./_3DOT_/g' \
  | sort \
  | sed -e 's/_3DOT_/\./g' \
        -e 's/_2DASH_/-/g' \
        -e 's/_0PLUS_/\+/g' \
        -e 's/_1UNDERSCORE_/_/g'

请注意,下划线的转换必须首先完成(最后还原),以免混淆其他转换后的特殊字符,这些特殊字符后来又转换了(先前还原了)。