在目录中,我有以下文件:
myfile_v01.txt
myfile_v02.txt
myfile_v03.txt
如何编写一个 bash 脚本来检测上一个版本的值并将该最新版本的文件名放入变量中?
答案1
不是很精致但似乎很实用:
var=$(ls | sort -V | tail -n 1)
然后你就得到了最后一个存储在$var
答案2
这是一个使用通配符的解决方案(因此不依赖于解析 ls),与 terdon 的第一个解决方案类似,但不需要遍历所有文件:
myfiles=(myfile_v*)
lastfile="${myfiles[${#myfiles[@]}-1]}"
unset myfiles
首先,将所有匹配的文件读入一个数组。然后,将数组的最后一个元素赋值给$lastfile
。最后,不再需要该数组,因此可以将其删除。
不幸的是,bash
(至少据我所知)不支持对通配符#myfile_v1.txt
的结果进行排序,因此此示例对于给定的命名方案(恰好两位数字,也适用于版本<10)可以正常工作,但对于, myfile_v2.txt
, ... ,会失败myfile_v10.txt
。
# zsh
(当然;)
)如此,所以zsh% myfiles=(myfile_v*(n)); lastfile="${myfiles[-1]}"; unset myfiles
不会受到这个限制。
答案3
有两种明显的方法,您可以解析文件名或查找最新的文件:
解析文件名,假定所有文件都按照您的示例命名:
$ latest=myfile_v$( for f in myfile_v*; do ver=${f##myfile_v}; ver=${ver%.txt}; echo $ver; done | sort -n | tail -n 1).txt
获取最新文件(假设文件名相对合理且不包含换行符)
$ latest=$(ls -tr | tail -n 1)
答案4
我可以总结一下这些好的方法:
使用“for”(这适用于任何 shell!):
for f in myfile_v*
do true
done
echo "$f"
使用表格:
myfiles=(myfile_v*)
lastfile="${myfiles[-1]}"
unset myfiles
echo "$lastfile"
使用函数参数和全局变量:
function last_arg(){
la="${!#}"
}
last_arg myfile_v*
echo "$la"
这些方法仅使用 shell 的内部命令。“sort”、“ls”、“tail”是外部程序:它们有一些启动成本。