2009-01-22 49 views
1

我将特定发行版的SQL脚本存储在以发行版本命名的'scripts'的子目录中,例如,Bash脚本:获取文件的子列表

... 
./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 
...  

在bash脚本中,我需要获取超出特定版本号的所有SQL文件。例如,如果这个版本号是1.9.4我想获取列表

./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 
...  

我知道我可以通过

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

获得通过发布命令文件的整个列表,但我不确定我可以如何过滤这个列表来获取特定版本的“在或之后”的所有文件。

+0

请仔细分类。即使使用-n。你的版本1.10.3(某人总是这样做)将会失灵。 – 2009-01-24 22:12:09

回答

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

+1,尼斯“版本算术”:) – orip 2009-01-22 18:24:02

2

蛮力(与正则表达式匹配的图案):

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

更好的方式与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 

说明:排序反向,然后使用sed停止处理输入的即时版本(1.9.4)匹配。

+0

为sed +1,忘记另一个 – hop 2009-01-22 18:52:35

1

一个捻,如果文件被创建按时间排序会

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

下面是基于Quassnoi的广义版本。

假设

$ 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 

(注意0.0.10自带0.0.9之前,这是错误的)。但是,如果我们执行一些“版本数学运算”,我们会得到正确的订单:

$ 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