在bash中提取更高数量的文件夹名称

时间:2019-07-11 15:20:03

标签: bash

我有一个具有以下结构的文件夹:

$ ls
DRS-1.1.0  DRS-1.3.0 DRS-1.3.1 DRS-1.3.2

随着时间的推移,文件夹版本将会增加(例如DRS-1.3.5DRS-1.4.1等)

如何将最高版本的名称存储到变量中? (在当前情况下为DRS-1.3.5

输出应为:

$ echo $VERSION
DRS-1.3.2

谢谢

3 个答案:

答案 0 :(得分:4)

使用GNU sort的版本进行排序:

printf '%s\n' DRS-* | sort -V | tail -n 1

输出:

DRS-1.3.2

答案 1 :(得分:2)

您可以使用awk来获取最大数量:

ver=$(printf '%s\n' DRS-* | awk -F- '$2 > max{max=$2; f=$0} END{print f}')

echo "$ver"

DRS-1.3.2

答案 2 :(得分:2)

Bash按字母顺序对它的全局扩展进行排序,因此我们可以索引这种扩展的最后一个元素:

files=(*)
VERSION=${files[$((${#files[*]}-1))]}
printf '%s\n' "$VERSION"

与依赖于过滤基于行的输出的方法相比,它具有一个优势,因为它将使用所有文件名,即使它们包含换行符也是如此。

不利之处在于,它仅限于排序规则,并且不像dpkg --compare-versions那样理解版本号;这将需要遍历数组,如下所示:

#!/bin/bash
set -eu
shopt -s nullglob

files=(DRS-*)
max=
for f in "${files[@]}"
do
    dpkg --compare-versions "${f#DRS-}" gt "${max#DRS-}" || continue
    max=$f
done

printf '%s\n' "$max"

(当然,它仍然可以用于包含换行符的文件名)

演示:

$ ls -1 DRS-*
DRS-1.1.0
DRS-1.12.0
DRS-1.3.0
DRS-1.3.1
DRS-1.3.2
$ ./find_max
DRS-1.12.0