2009-01-22 8 views
1

Je stocke le script SQL pour une version particulière dans un sous-répertoire de 'scripts' nommé d'après la version de publication, par ex.Script Bash: obtention de la sous-liste du fichier

... 
./scripts/1.8.3/script-1.8.3.sql 
./scripts/1.8.4/script-1.8.4.sql 
./scripts/1.8.4.1/script-1.8.4.1.sql 
./scripts/1.8.4.2/script-1.8.4.2.sql 
./scripts/1.8.4.3/script-1.8.4.3.sql 
./scripts/1.9.0/script-1.9.0.sql 
./scripts/1.9.1/script-1.9.1.sql 
./scripts/1.9.2/script-1.9.2.sql 
./scripts/1.9.3/script-1.9.3.sql 
./scripts/1.9.4/script-1.9.4.sql 
./scripts/1.9.5/script-1.9.5.sql 
./scripts/1.9.6/script-1.9.6.sql 
./scripts/1.9.6.1/script-1.9.6.1.sql 
...  

Dans un script bash, je dois obtenir tous les fichiers SQL qui s'appliquent au-delà d'un certain numéro de version. Par exemple, si ce numéro de version est 1.9.4 Je voudrais obtenir la liste

./scripts/1.9.4/script-1.9.4.sql 
./scripts/1.9.5/script-1.9.5.sql 
./scripts/1.9.6/script-1.9.6.sql 
./scripts/1.9.6.1/script-1.9.6.1.sql 
...  

Je sais que je peux obtenir la liste complète des fichiers commandés par la libération par

all_files = `find . -name '*.sql' | sort` 

Mais je ne suis pas sûr comment je peux filtrer cette liste pour obtenir tous les fichiers "sur ou après" une version particulière.

+0

Soyez prudent couting sur le tri. Même avec -n. vous version 1.10.3 (que quelqu'un fait toujours) va être hors service. –

Répondre

4
echo 1.2.3 | awk -F'.' '{ ver=1000000*$1 + 1000*$2 + $3; if (ver > 1002001) print $_ }' 
+0

+1, Nice "version arithmétique" :) – orip

2

force brute (motifs correspondant à regexps):

find . -name "*.sql" | egrep -v "1\.[0-8]|1\.9\.[0-3]" 

Nicer chemin avec sed:

% find . -name "*.sql" | sort -r | sed '/1\.9\.4/ {q}' 
... 
./scripts/1.9.6/script-1.9.6.sql 
./scripts/1.9.6.1/script-1.9.6.1.sql 
./scripts/1.9.5/script-1.9.5.sql 
./scripts/1.9.4/script-1.9.4.sql 

Explication: trier dans le sens inverse, puis utiliser sed pour arrêter le traitement de l'entrée de la instant la version (1.9.4) est appariée.

+0

+1 pour les sed, oubliez les autres – hop

+0

Attention scrupuleux sur le tri. Même avec "-n" version 1.10.14 serait hors service. –

1

une torsion si les fichiers sont créés commandés par le temps serait

find . -name \*.sql -newer ./scripts/$VERSION/script-$VERSION.sql -print 
0

est ici une version généralisée basée sur de Quassnoi.

On suppose

$ ls -1 releases/ 
    program-0.0.1.app 
    program-0.0.10.app 
    program-0.0.9.app 
    program-0.3.1.app 
    program-3.3.1.app 
    program-3.30.1.app 
    program-3.9.1.app 

(avis 0.0.10 vient avant 0.0.9, ce qui est faux). Toutefois, si nous effectuons un certain "version math" nous obtenons l'ordre correct:

$ ls -1 releases/ | sed 's/\(program-\)\(.*\)\(\.app\)/\2 \1\2\3/g' | awk -F '.' '{ ver=1000000*$1 + 1000*$2 + $3; printf "%010d %s\n", ver, $0}' | sort | awk '{print $3}' 
program-0.0.1.app 
program-0.0.9.app 
program-0.0.10.app 
program-0.3.1.app 
program-3.3.1.app 
program-3.9.1.app 
program-3.30.1.app 
Questions connexes