首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提取bash中文件夹名的较高数目。

提取bash中文件夹名的较高数目。
EN

Stack Overflow用户
提问于 2019-07-11 15:20:03
回答 2查看 58关注 0票数 0

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

代码语言:javascript
复制
$ 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)

产出应是:

代码语言:javascript
复制
$ echo $VERSION
DRS-1.3.2

谢谢

EN

回答 2

Stack Overflow用户

发布于 2019-07-11 15:29:46

您可以使用awk获得最大数字:

代码语言:javascript
复制
ver=$(printf '%s\n' DRS-* | awk -F- '$2 > max{max=$2; f=$0} END{print f}')

echo "$ver"

代码语言:javascript
复制
DRS-1.3.2
票数 2
EN

Stack Overflow用户

发布于 2019-07-11 15:30:10

Bash按字母顺序对其glob展开进行排序,因此我们只需对这种扩展的最后一个元素进行索引:

代码语言:javascript
复制
files=(*)
VERSION=${files[$((${#files[*]}-1))]}
printf '%s\n' "$VERSION"

这与依赖基于行的输出的方法相比有一个优势,因为它可以工作所有文件名,即使它们包含换行符。

缺点是,它仅限于排序排序,不像(比方说) dpkg --compare-versions那样理解版本号;这将需要迭代数组,如下所示:

代码语言:javascript
复制
#!/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"

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

演示:

代码语言:javascript
复制
$ 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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56992519

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档