我有几个文件夹
src/1.0.0.1/
src/1.0.0.2/
src/1.0.0.12/
src/1.0.0.13/
src/1.0.1.1/
我正在寻找一个总是只返回最新版本的bash命令链。
在大写字母中1.0.1.1
。如果1.0.1.1
不存在,则最新版本为1.0.0.13
我在OS X上,所以sort没有-V选项。
有人可以帮助我吗?
答案 0 :(得分:2)
使用sort
(-V
选项执行版本排序):
$ ls -1 src/
1.0.0.1
1.0.0.12
1.0.0.13
1.0.0.2
$ find src/1* -type d | sort -rV
src/1.0.0.13
src/1.0.0.12
src/1.0.0.2
src/1.0.0.1
$ mkdir src/1.0.1.1
$ find src/1* -type d | sort -rV
src/1.0.1.1
src/1.0.0.13
src/1.0.0.12
src/1.0.0.2
src/1.0.0.1
将输出管道传输到head
,您只能获得最高版本:
$ find src/1* -type d | sort -rV | head -1
src/1.0.1.1
答案 1 :(得分:2)
您还可以使用awk脚本:
#!/usr/bin/awk -f
$0 ~ /[0-9]+(.[0-9]+)*\/?$/ {
t = $0
sub(/\/$/, "", t)
sub(/.*\//, "", t)
current_count = split(t, current_array, /\./)
is_later = 0
for (i = 1; i <= current_count || i <= latest_count; ++i) {
if (current_array[i] > latest_array[i]) {
is_later = 1
break
} else if (latest_array[i] > current_array[i]) {
break
}
}
if (is_later) {
latest_string = $0
latest_count = split(t, latest_array, /\./)
}
}
END {
if (latest_count) {
print latest_string
}
}
执行命令
find src/ -maxdepth 1 -type d | awk -f script.awk ## Or
ls -1 src/ | awk -f script.awk
您还可以使用最小化版本:
... | awk -- '$0~/[0-9]+(.[0-9]+)*\/?$/{t=$0;sub(/\/$/,"",t);sub(/.*\//,"",t);c=split(t,a,/\./);l=0;for(i=1;i<=c||i<=z;++i){if(a[i]>x[i]){l=1;break}else if(x[i]>a[i])break}if(l){s=$0;z=split(t,x,/\./)}}END{if(z)print s}'