我正在尝试匹配文件的前几个字母。
for entry in `ls`; do
echo $entry
done
使用上面的代码我得到所有文件的名称。
我在开始时有几个名字相似的文件:
Beaglebone-v1
Beaglebone-v3
Beaglebone-v2
如何将$entry
与Beaglebone *进行比较,然后提取最新版本的文件名?
答案 0 :(得分:1)
如果要循环遍历所有Beaglebone-*
个文件:
for entry in Beaglebone-* ; do
echo $entry
done
如果您只需要具有最新版本的文件,您可以依赖于按字母顺序对您的名称进行排序的事实,因此您可以这样做:
LATEST_FILE_NAME=$(ls Beaglebone-* | tail -n 1)
将按字母顺序排列最后一个。
答案 1 :(得分:1)
要处理更大的数字,您可以使用如下数字比较:
stem="Beaglebone-v"
for file in $stem*; do
ver=${file#"$stem"} # cut away stem to get version number
(( ver > max )) && max=$ver # conditionally assign `ver` to `max`
done
echo "$stem$max"
测试出来:
bash-4.3$ ls Beaglebone-v*
Beaglebone-v1 Beaglebone-v10 Beaglebone-v2 Beaglebone-v3
bash-4.3$ stem="Beaglebone-v" &&
for file in $stem*
do
ver=${file#"$stem"}
(( ver > max )) && max=$ver
done; echo "$stem$max"
Beaglebone-v10
答案 2 :(得分:0)
您可以将与模式匹配的文件名存储在数组中,然后选择数组的最后一个元素。
shopt -s nullglob
arr=( Beaglebone-* )
if (( ${#arr[@]} > 0 ))
then
latest="${arr[ (( ${#arr[@]} - 1 )) ]}"
echo "$latest"
fi
你需要启用nullglob
,这样如果没有与模式匹配的文件,你将获得一个空数组,而不是模式本身。
答案 3 :(得分:0)
如果版本号超出个位数,
function version_numbers {
typeset w; for w in $1-v*; do echo ${w#$1-v}; done
}
version_numbers "Beaglebone" | sort -n | tail -1
或者,添加函数max
:
# read a stream of numbers, from stdin (one per line)
# and return the largest value
function max
{
typeset _max n
read _max || return
while read n; do
((_max < n)) && _max=$n
done
echo $_max
}
我们现在可以在没有外部命令的情况下完成所有事情:
version_numbers Beaglebone | max
请注意,如果任何一行未通过数字比较,max
将会失败。