2013-03-15 46 views
0

我想從一個目錄中的最大版本號在那裏我有一個程序我如何添加一些文字管無臨時文件

例如幾個版本,如果LS的輸出

something01_1.sh 
something02_0.1.2.sh 
something02_0.1.sh 
something02_1.1.sh 
something02_1.2.sh 
something02_2.0.sh 
something02_2.1.sh 
something02_2.3.sh 
something02_3.1.2.sh 
something.sh 

我得到最大的版本號與以下 -

ls somedir | grep some_prefix | cut -d '_' -f2 | sort -t '.' -k1 -r | head -n 1 

現在,如果在同一時間,我想用的版本號,我已經在系統中,以檢查其最新最好的辦法做到這一點......在bash

我得到這個工作(如果2.5是當前版本)

(ls somedir | grep some_prefix | cut -d '_' -f2; echo 2.5) | sort -t '.' -k1 -r | head -n 1 

有沒有做任何其他的正確方法?

編輯:在上面的例子some_prefix是東西02。

編輯:這裏實際的問題是

(ls smthing; echo more) | sort 

是它合併兩個命令/程序的輸出管道聯接到第三的最佳方式。

+1

您是否考慮過使用真正的版本控制系統,比如'git'? – 2013-03-15 21:09:56

+0

這個決定不是我的。 – Mohit 2013-03-15 22:04:34

回答

4

我有找到了解決方案。看起來最好的方式是使用流程替換。

cat <(ls smthing) <(echo more) | sort 

我的版本例如

cat <(ls somedir | grep some_prefix | cut -d '_' -f2) <(echo 2.5) | sort -t '.' -k1 -r | head -n 1 

爲未來的讀者的利益,我建議 - 請給一個班輪的誘惑和利用水珠爲chepner建議。

superuser上詢問幾乎類似的問題。

有關更多信息process substitution

2

是下面的代碼,你要查找的內容更適合:

#/bin/bash 

highest_version=$(ls something* | sort -V | tail -1 | sed "s/something02_\|\.sh//g") 
current_version=$(echo $0 | sed "s/something02_\|\.sh//g") 

if [ $current_version > $highest_version ]; then 
    echo "Uh oh! Looks like we need to update!"; 
fi 
+0

這是否完成你所需要的? – 2013-03-15 20:52:28

+0

你確定嗎?在每個shell中,我知道$ 0是正在運行的程序的名稱,而不是版本號。祝你們好運! – shellter 2013-03-15 20:57:45

+0

@保羅 - 對不起。但我想你誤解了我的問題。我的意思是我想獲得目錄中的文件和正在運行的文件中的最大版本號。我沒有在相關計劃中進行這項檢查。如示例中所述。我運行的是某些東西的版本2.5,它可能會或可能不會出現在更新目錄中。我需要弄清楚當前的運行是否是最新的,如果我需要更換。替換對我來說很貴。我不能在沒有檢查的情況下開始最新的工作。 – Mohit 2013-03-15 20:57:54

1

你可以嘗試這樣的事情:

#! /bin/bash 

lastversion() { # prefix 
    local prefix="$1" a=0 b=0 c=0 r f vmax=0 

    for f in "$prefix"* ; do 
    test -f "$f" || continue 
    read a b c r <<< $(echo "${f#$prefix} 0 0 0" | tr -C '[0-9]' ' ') 
    v=$(((a*100+b)*100+c)) 
    if ((v>vmax)); then vmax=$v; fi 
    done 
    echo $vmax 
} 

lastversion "something02" 

它會打印:30102

+0

感謝您的回答。我最終在perl中做了同樣的事情。但問題仍然存在。如何做###(ls smthing; echo more)|只用管道排序###。 – Mohit 2013-03-17 17:25:42