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