Listar arquivos que ocorrem lexicamente após / maior que um dado prefixo (ou, execute scripts de atualização de banco de dados em uma ordem apropriada)

2

Estou tentando criar um script de shell que executa vários scripts SQL.

Eu tenho esses arquivos:

$ ls upgrade/
01-foo.sql 02-bar.sql 02-baz.sql 03-foo1.sql 04-buz.sql

E eu tenho a versão do banco de dados atual, por exemplo DB_VERSION=02

Como agora posso percorrer e globar os arquivos com um prefixo maior que meu $ DB_VERSION e executá-los em ordem?

i.e. Eu gostaria de fazer

for f in ???? ; do 
   mysql &lt $f
done

e, com DB_VERSION = 02, execute os 03-foo1.sql e 04-buz.sql , nessa ordem.

    
por nos 11.10.2011 / 14:11

2 respostas

3

Configuração inicial: touch 01-foo.sql 02-bar.sql 02-baz.sql 03-foo1.sql 04-buz.sql 09-quux.sql 10-lala.sql 99-omg.sql

Código real: curr=02; for file in ??-*.sql; do ver="${file:0:2}"; [ "$ver" -gt "$curr" ] && echo "$file"; done

Ou seja, defina a versão atual como 02 e, em seguida, observe todos os arquivos (o globbing é alfabético), executando-os se o prefixo do número for numericamente maior. Substitua mysql (ou o que você tem) por echo .

    
por 11.10.2011 / 15:16
0

No zsh:

DB_VERSION=02
glob="<$((DB_VERSION+1))->"
for x in $~glob-*; do mysql <$x; done

O operador% glob glob corresponde a números inteiros em um intervalo. Você só pode usar um inteiro literal, não o resultado de um cálculo. Portanto, primeiro construímos um padrão glob como o valor de um parâmetro e usamos esse parâmetro como um padrão global, graças ao <LOW-UP> opção de expansão de parâmetro .

    
por 12.10.2011 / 02:10