Bash 匹配文件名的前几个字母:Shell脚本

Bash 匹配文件名的前几个字母:Shell脚本,bash,shell,Bash,Shell,我正在尝试匹配文件的前几个字母 for entry in `ls`; do echo $entry done 通过上面的代码,我得到了所有文件的名称 我在开始时有几个名称类似的文件: Beaglebone-v1 Beaglebone-v3 Beaglebone-v2 如何将$entry与Beaglebone*进行比较,然后提取最新版本的文件名?如果要循环所有Beaglebone-*文件: for entry in Beaglebone-* ; do echo $entry d

我正在尝试匹配文件的前几个字母

for entry in `ls`; do
    echo $entry
done
通过上面的代码,我得到了所有文件的名称

我在开始时有几个名称类似的文件:

Beaglebone-v1
Beaglebone-v3
Beaglebone-v2

如何将
$entry
与Beaglebone*进行比较,然后提取最新版本的文件名?

如果要循环所有
Beaglebone-*
文件:

for entry in Beaglebone-* ; do
    echo $entry
done
如果您只需要最新版本的文件,您可以根据ls按字母顺序对您的姓名进行排序,因此您可以执行以下操作:

LATEST_FILE_NAME=$(ls Beaglebone-* | tail -n 1)

它将按字母顺序取最后一个。

您可以将与模式匹配的文件名存储在数组中,然后选择数组的最后一个元素

shopt -s nullglob
arr=( Beaglebone-* )
if (( ${#arr[@]} > 0 ))
then
    latest="${arr[ (( ${#arr[@]} - 1 )) ]}"
    echo "$latest"
fi

您需要启用
nullglob
,这样,如果没有与模式匹配的文件,您将得到一个空数组,而不是模式本身。

要处理较大的数字,您可以使用如下数字比较:

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

如果版本号可以超过个位数

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
}

请注意,
max
如果任何一行没有通过数值比较,都会严重失败。

事实上,这里绝对没有必要使用
ls
。是的,谢谢你的评论。我在回答中更改了它。警告所有竞争者:对于单个数字,您可以执行
list=Beaglebone-v*;echo${list##Beaglebone-}
。对于较大的数字,您需要进行数字排序,这需要更多的工作。@Henk说得好。我在回答中已经考虑过了。
version_numbers Beaglebone | max