在bash中提取文件夹名称中较高的数字

在bash中提取文件夹名称中较高的数字,bash,Bash,我有一个具有以下结构的文件夹: $ ls DRS-1.1.0 DRS-1.3.0 DRS-1.3.1 DRS-1.3.2 随着时间的推移,文件夹版本将增加,例如DRS-1.3.5、DRS-1.4.1等 如何将最高版本的名称存储到变量中?在当前情况下,DRS-1.3.5 输出应为: $ echo $VERSION DRS-1.3.2 谢谢您可以使用awk获得最大号码: ver=$(printf '%s\n' DRS-* | awk -F- '$2 > max{max=$2; f=$0}

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

$ ls
DRS-1.1.0  DRS-1.3.0 DRS-1.3.1 DRS-1.3.2
随着时间的推移,文件夹版本将增加,例如DRS-1.3.5、DRS-1.4.1等

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

输出应为:

$ echo $VERSION
DRS-1.3.2
谢谢

您可以使用awk获得最大号码:

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

echo "$ver"

Bash按字母顺序对其glob扩展进行排序,这样我们就可以为这种扩展的最后一个元素编制索引:

files=(*)
VERSION=${files[$((${#files[*]}-1))]}
printf '%s\n' "$VERSION"
与依赖于筛选基于行的输出的方法相比,这种方法有一个优势,即它可以处理所有文件名,即使它们包含换行符

缺点是,它仅限于排序规则,不能像dpkg-compare版本那样理解版本号;这将需要遍历数组,如下所示:

#!/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"
当然,这仍然适用于包含换行符的文件名

演示:
使用GNU sort的版本排序:

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

DRS-1.3.2
如果版本是按单调递增的顺序添加的,那么让添加文件夹的人在最近添加的文件夹中维护一个名为current的符号链接可能会更容易。@chepner:事实上,这是一个很好的方法,因为它给了我更大的灵活性。还易于实施和维护,因为版本每年更改不会超过两次。谢谢在这里,通过头部过滤的反向排序比尾部过滤的效率要高一点。然而,你是否能够在现代系统上衡量差异是有争议的…@托比斯佩特:真的吗?这是怎么回事?@jorgehumberto:tail需要通读所有的输入,在本例中保持最后n1行的缓冲区。head只需要将前n行复制到其输出,然后退出,甚至不读取其余的输入。排序不在乎它是升序还是降序-这应该不会影响它的执行。感谢您的详细解释!我必须说我喜欢awk方法,因为它使用了awk。谢谢是的,优点是awk在一个命令中完成所有操作,而不是调用多个管道命令。
printf '%s\n' DRS-* | sort -V | tail -n 1
DRS-1.3.2