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

时间:2014-05-20 08:19:25

标签: bash shell

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

for entry in `ls`; do
    echo $entry
done

使用上面的代码我得到所有文件的名称。

我在开始时有几个名字相似的文件:

Beaglebone-v1
Beaglebone-v3
Beaglebone-v2

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

4 个答案:

答案 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将会失败。