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

How Can I list files in the same order that flyway executes them in bash?

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

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

以上是ls列出的顺序,也就是find的默认排序顺序。它们被flyway执行的顺序是

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

有没有办法使用bash排序命令按照flyway执行文件的顺序列出文件?无法重命名文件。

你的问题的答案是"No. At least, not by itself."

首先,没有"bash sort command"。 sort 命令实际上并不是 bash 的一部分,它是您的操作系统提供的一个单独的工具。虽然它的用法因操作系统而异,但据我所知,没有哪个版本会按照您要求的方式对您的输入进行排序。[1] 通过 [= 了解有关其功能的更多信息30=] man sort 在你的 shell.

一个选项可能是通过使其可排序的方式流式传输您的文件列表,然后在排序后通过反向转换流式传输它:

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

[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'

请注意,需要先转换下划线(最后恢复),以免混淆其他转换后的特殊处理字符,这些字符稍后转换(并较早恢复)。