2009-01-22 50 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