如何按照 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'
请注意,需要先转换下划线(最后恢复),以免混淆其他转换后的特殊处理字符,这些字符稍后转换(并较早恢复)。
我有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'
请注意,需要先转换下划线(最后恢复),以免混淆其他转换后的特殊处理字符,这些字符稍后转换(并较早恢复)。