私はほとんどのバージョン番号のディレクトリを持っていますが、別の特定のバージョンの直前にバージョンソートされたものを特定しようとしています。bashでソートされたリストから選択
ここでの背景は、これらのバージョン番号がWebコンテンツ用のgitタグから派生したもので、サイトの仮想ホストのバージョン番号public_html
ディレクトリをバージョン管理されたディレクトリにシンボリックリンクすることです。
それはこのようなものになります。
drwxr-xr-x 8 graham www 17 Oct 17 2013 v2.0.10
drwxr-xr-x 8 graham www 17 Oct 17 2013 v2.0.11
drwxrwxr-x 8 graham www 17 Aug 29 2013 v2.0.8
drwxr-xr-x 8 brian www 17 Oct 17 2013 v2.0.9
...
drwxr-xr-x 9 graham www 21 Aug 5 2015 v4.19.0
drwxr-xr-x 10 graham www 19 Dec 17 2014 v4.2.0
drwxr-xr-x 9 brian www 21 Aug 10 2015 v4.20.0
drwxr-xr-x 9 brian www 21 Aug 10 2015 v4.20.0-fail
drwxr-xr-x 9 graham www 21 Aug 11 2015 v4.20.1
...
drwxr-xr-x 9 graham www 19 Mar 14 11:00 v4.35.0
drwxr-xr-x 9 graham www 19 Mar 14 13:28 v4.36.0
drwxr-xr-x 9 graham www 19 Mar 16 10:58 v4.36.1
lrwxr-xr-x 1 graham www 11 Mar 16 11:13 public_html -> v4.36.1
シンボリックリンクは常に最新のバージョンを指してされないことを(例えば、我々は変更をバックアウトしていた場合)。私の目標は、public_html
が指し示すディレクトリよりも前にソートされたバージョンである適切な名前のディレクトリ(つまり、*-fail
などをスキップします)を見つけることです。
私stat
コマンドは次のようにうまく動作しますので、私は、FreeBSDの中だ:
read target <<<"$(stat -f'%Y' "${base}/public_html")"
あなたは、Linuxであれば、私はあなたがこのようなものと同じ効果を得ることができ集める:
target="$(stat -c '%N' "${base}/public_html")"
target="${target#* -> ?}"; target="${target%?}"
ここからは、どのようにバージョン番号を収集するのか分かりません。私はFreeBSDにいるので、私のsort
コマンドには-V
オプションがありません。私は2つの方法を試みました。
最初のディレクトリの内容にwhileループを処理する:
shopt -s extglob
while read this; do
[[ "$this" = "$target" ]] && break
previous="$this"
done < $(ls -1d v+([0-9]).+([0-9]).+([0-9]) | sort -n -t . -k1,1 -k2,2 -k3,3)
第二の代わりに配列を解析し、かなり類似している:
shopt -s extglob
a=($(ls -1d v+([0-9]).+([0-9]).+([0-9]) | sort -n -t . -k1,1 -k2,2 -k3,3))
for ((n=0; n<${#a[@]}; n++)); do
[[ "${a[$n]}" = "$target" ]] && break
previous="${a[$n]}"
done
これらの両方が落ちる場合がありますsort
で、最初のフィールドはソートされていないようです。私はそれが数字ではないからだと思う(最初は "v"で、 "。"で区切られている)。どういうわけか、複数の区切り文字を指定する方法がありますか、それ以外の場合は「無視」しますか?v
これを処理するには、移植性の低いオプションの外部sort
コマンドを使用するよりも良い方法がありますか?たぶん内部の何かをbashにする?
ありがとうございました。
?これはバージョンオプションがないための回避策です。 – karakfa
申し訳ありませんが、私の間違い。今日の午後は読むことができません。 –