Как я могу перечислить файлы в том же порядке, в котором flyway выполняет их в bash? - PullRequest
0 голосов
/ 25 июня 2018

У меня есть сценарии миграции с миграционного пути, которые названы следующим образом.

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

Выше приведен порядок, в котором они перечислены с помощью ls, или порядок сортировки по умолчанию для поиска. Порядок, в котором они выполняются на пролетном пути:

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

Есть ли способ использовать команду сортировки bash, чтобы вывести список файлов в том порядке, в котором их выполняет flyway? Файлы не могут быть переименованы.

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Я полагаю, что сначала выполняется 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'

Обратите внимание, что преобразование подчеркивания должно выполняться в первую очередь (и отменяется последним), чтобы не перепутать другие преобразованные специально обработанные символы, которые преобразовываются позже (и возвращаются раньше).

0 голосов
/ 25 июня 2018

Ответ на ваш вопрос: «Нет. По крайней мере, не сам по себе».

Во-первых, нет "команды сортировки 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] Я бы хотел исправить это положение.

...