0

1 つのプログラムの複数のバージョンがあるディレクトリから最大バージョン番号を取得しようとしています

たとえば、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 は something02 です。

編集:ここでの実際の問題は

(ls smthing; echo more) | sort 

パイプ用の2つのコマンド/プログラムの出力を3番目にマージするのが最善の方法ですか?

4

3 に答える 3

8

私は解決策を見つけました。最善の方法は、プロセス置換を使用することです。

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

将来の読者のために、私はお勧めします-ワンライナーのルアーを落とし、チェプナーが提案したようにグロブを使用してください。

スーパーユーザーについても、ほぼ同様の質問があります。

プロセス置換に関する詳細情報。

于 2013-03-17T17:38:53.000 に答える
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
于 2013-03-15T20:52:13.487 に答える
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

于 2013-03-16T13:05:45.220 に答える