在 bash 中的变量中获取最后一个文件名?

在 bash 中的变量中获取最后一个文件名?

在目录中,我有以下文件:

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

有两种明显的方法,您可以解析文件名或查找最新的文件:

  1. 解析文件名,假定所有文件都按照您的示例命名:

    $ 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
    
  2. 获取最新文件(假设文件名相对合理且不包含换行符)

    $ 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”是外部程序:它们有一些启动成本。

相关内容