【问题标题】:How Can I list files in the same order that flyway executes them in bash?如何按照flyway在bash中执行它们的顺序列出文件?
【发布时间】:2018-12-04 05:27:11
【问题描述】:

我有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 sort 命令按照 flyway 执行文件的顺序列出文件?文件无法重命名。

【问题讨论】:

  • 术语»它们在 bash 中列出的顺序« 不清楚。你输入什么来得到这个列表? ls 不是 bash 的一部分。您是否使用echo * 或类似的方式列出它们?
  • 为清晰起见编辑

标签: bash find flyway ls


【解决方案1】:

您的问题的答案是“不。至少,不是单独的。”

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

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

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

[1] 我很乐意在这一点上得到纠正。

【讨论】:

    【解决方案2】:

    我猜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'
    

    请注意,需要先转换下划线(最后还原),以免混淆其他经过特殊处理的字符,这些字符稍后会转换(并更早还原)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多